Java 将@RequestBody转换为对象

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

伙计们,我已经做了足够的研究,但我仍然找不到解决这个问题的方法

简而言之,我只是将url编码的表单数据传递给控制器方法,并尝试将其转换为具有日期和整数的域对象

@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?这很奇怪…请用任何澄清更新您的原始答案。