Java 将@RequestBody转换为对象
伙计们,我已经做了足够的研究,但我仍然找不到解决这个问题的方法 简而言之,我只是将url编码的表单数据传递给控制器方法,并尝试将其转换为具有日期和整数的域对象Java 将@RequestBody转换为对象,java,jquery,spring,jakarta-ee,spring-mvc,Java,Jquery,Spring,Jakarta Ee,Spring Mvc,伙计们,我已经做了足够的研究,但我仍然找不到解决这个问题的方法 简而言之,我只是将url编码的表单数据传递给控制器方法,并尝试将其转换为具有日期和整数的域对象 @RequestMapping(value = "/savePassport", method = RequestMethod.POST) public @ResponseBody AjaxResponse savePassport(@RequestBody StaffPassport passport, HttpServ
@RequestMapping(value = "/savePassport", method = RequestMethod.POST)
public @ResponseBody
AjaxResponse savePassport(@RequestBody StaffPassport passport, HttpServletResponse response) {
// Some operations.
}
员工护照如下所示:
import java.sql.Date;
public class StaffPassport {
private int staffId;
private String passportNumber;
private String placeOfIssue;
private Date issueDate;
private Date expiryDate;
private String spouseName;
private String oldPassportRef;
private String visaInfo;
private String description;
//gets/sets
}
调用/savePassport时,会出现不受支持的媒体异常。我想这和演员有关
我不能让它正常工作。当然,我可以使用@RequestParam捕获单个表单数据并手动执行强制转换,但这不是框架的重点,不是吗
我哪里做错了?你是对的。我是春天的初学者,但我喜欢它。首先要确保你有
<mvc:annotation-driven />
在Spring配置文件中。这对于在SpringMVC中使用JSOn是必需的
其次,我建议您测试对服务器的请求是否具有application/json内容类型。我相信小提琴手2会帮你做到这一点
第三,但我不确定,尝试将POJO中的日期项从SQL类型更改为常规java类型
更新:
只要看一下表单,您的“接受”HTTP头也应该是application/json。请使用Fiddler2测试此问题 看起来您使用了错误的注释
@RequestBody
用于接收正文中包含任意内容的请求,例如JSON、一些应用程序定义的XML、逗号分隔的变量。。无论什么并使用在DispatcherServlet中配置的封送器将其转换为对象
如果您只想让Spring为您将一个普通的旧表单post绑定到支持对象上,那么要在方法参数上添加的正确注释是
@modeldattribute
我假设您正在发布JSON,并希望Spring转换为StaffPassport。如果您遇到不受支持的介质异常,这是因为Spring无法找到执行转换的适当方法
对于转换JSON的Spring,它需要Jackson——确保您的项目中有Jackson JAR。如果这是一个基于Maven的项目,您可以将jackson mapper asl工件ID添加到pom.xml中。这将为您提供jackson mapper和jackson core罐子
编辑:我应该提到,这适用于Spring3(我最近遇到了这个问题)。我不确定以前版本的Spring还需要什么。查看HttpMessageConverter接口及其实现。您可以编写自己的实现,将其转换为所需的域模型。当控件到达方法时,您可以像传递域模型对象一样访问它 好的,我想我应该完善我的答案。我没有在SpringMVC项目中使用它的直接经验,但是有SpringIntegration的经验。我非常确定Spring框架已经处理了适用的媒体类型(application/x-url-form-encoded)并将其转换为MultiMap;因此,从中检索值,就像任何其他以键值为表单变量的映射一样,并填充业务模型
嗯 如果您使用jQuery发布JSON对象,并且希望Spring能够使用@RequestBody处理它,请在数据中使用JSON.stringify(..)。这里有一个例子:
var data = { "id": 3, "name": "test" }
$.post("processJsonData.html",JSON.stringify(data), function(data){
...
}
);
如果您不使用JSON.stringify(),那么您将以表单数据的形式提交数据,Spring将告诉您有不受支持的媒体类型。我没有使用基于Spring的表单。我只是通过序列化表单和调用控制器方法来使用ajax调用。我也尝试过@modeldattribute。不过,我想约会演员也有一些问题。如果有任何特殊的配置需要完成,请给出建议。完成此工作的类是WebDataBinder。手动执行会很痛苦,因为其中有很多配置。是的,java.sql.Date没有默认的属性编辑器。您需要注册自己的属性编辑器,以便使用@InitBinder.Bit延迟我的响应将字符串转换为日期。你是对的。我使用@modeldattribute和WebDataBinder的组合,得到了解决方案。我使用了错误的注释。好问题,ResponseBody工作得很好,但是没有人知道如何使RequestBody自动绑定到bean?这很奇怪…请用任何澄清更新您的原始答案。