将@RequestBody转换为对象

时间:2011-05-04 21:15:45

标签: java jquery spring java-ee spring-mvc

伙计们,我做了足够多的研究,但我找不到解决办法。

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

@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捕获单个表单数据并手动执行转换但是这不是框架的重点不是吗?

我哪里错了?而你是对的。我是春天的初学者,但我喜欢它。

6 个答案:

答案 0 :(得分:9)

看起来你正在使用错误的注释。 @RequestBody用于获取其正文中包含任意内容的请求,例如JSON,某些应用程序定义的XML,逗号分隔的变量等等。并使用您在调度程序servlet中配置的编组器将其转换为对象。

如果要做的就是让Spring将一个普通的旧表单帖子绑定到后备对象上,那么放在方法参数上的正确注释是@ModelAttribute

答案 1 :(得分:1)

如果您使用jQuery发布JSON对象并且希望Spring能够使用@RequestBody处理它,请在数据中使用JSON.stringify(....)。这是一个例子:

var data = { "id": 3, "name": "test" }
$.post("processJsonData.html",JSON.stringify(data), function(data){
    ...
  }
);

如果您不使用JSON.stringify(),那么您将提交数据作为表单数据,Spring会告诉您,您的媒体类型不受支持。

答案 2 :(得分:0)

首先要确保你有

<mvc:annotation-driven /> 
在Spring配置文件中

。这对于在SPring MVC中使用JSOn是必需的。

其次,我建议你测试一下对服务器的请求是否具有application / json内容类型。我相信Fiddler2会帮助你这样做。

第三,但我不确定,尝试将POJO中的日期项从SQL类型更改为常规java类型。

更新: 刚看了Form,看起来你的“Accept”HTTP Header应该也是application / json。请用Fiddler2测试这个问题。

答案 3 :(得分:0)

我假设您发布了JSON并希望Spring转换为StaffPassport。如果您收到不支持的媒体异常,那是因为Spring无法找到执行转换的适当方法。

对于Spring转换JSON,需要杰克逊 - 确保你的项目中有杰克逊的罐子。如果这是一个基于Maven的项目,您可以将jackson-mapper-asl工件ID添加到您的pom.xml中。这应该给你杰克逊映射器和杰克逊核心罐。

编辑:我应该提到这适用于Spring 3(我最近遇到了这个问题)。我不确定以前版本的Spring还需要什么。

答案 4 :(得分:0)

检查HttpMessageConverter接口及其实现。您可以编写自己的实现,将其转换为您想要的域模型。当控件进入您的方法时,您可以像访问域模型对象一样访问它。

答案 5 :(得分:-1)

好的,我想我应该改进我的答案。我没有在spring-mvc项目中使用它的直接经验,而是Spring-integration。我很确定适用的媒体类型(application / x-url-form-encoded)已经被Spring框架处理并转换为MultiMap;因此,从其中检索值,就像任何其他地图一样,键值是表单变量,并填充您的业务模型。

HTH。