2011-05-04 286 views
7

伙计们,好吧,我已经做了足够的研究,但仍无法找到解决方案。将@RequestBody转换为对象

简而言之,我只是将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捕捉单独的表单数据并手动执行转换,但这不是框架的重点,不是吗?

我哪里错了?你说得对。我是春季初学者,但我喜欢它。

+0

好问题,ResponseBody运行良好,但没有人知道如何让RequestBody自动绑定到一个bean?这很奇怪... – 2011-05-08 23:06:42

回答

9

看起来像是使用了错误的注释。 @RequestBody用于接受任意内容的请求,如JSON,某些应用程序定义的XML,逗号分隔变量等等。并使用您在调度程序servlet中配置的编组器将其变为对象。

如果您要做的只是要求Spring将简单的旧表单帖子绑定到支持对象上,那么放在方法参数上的正确注释是@ModelAttribute

+0

我不使用基于弹簧的表格,使用。我只是通过序列化窗体并调用控制器方法来使用ajax调用。我也尝试过使用@ModelAttribute。但是,再次,似乎有一些问题与日期铸造我猜。如果有任何特殊配置需要完成,您可以请教建议吗? – 2011-05-04 23:34:22

+0

完成工作的类是WebDataBinder。手动完成它会很痛苦,因为有很多配置进入它。 – Affe 2011-05-04 23:40:46

+0

对于java.sql.Date,没有默认的属性编辑器。您需要注册您自己的属性编辑器,以使用@InitBinder将字符串转换为日期。 – Affe 2011-05-04 23:43:36

0

首先确保你在Spring配置文件中有

<mvc:annotation-driven /> 

。这对于在SPring MVC中使用JSOn是强制性的。

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

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

更新: 只是看着窗体,它看起来像你的“接受”HTTP头应该也是application/json。请使用Fiddler2来测试这个问题。

0

我假设你正在发布JSON并希望Spring将其转换为StaffPassport。如果您得到不受支持的媒体异常,那是因为Spring无法找出执行转换的适当方式。

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

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

0

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

-1

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

HTH。

+0

请更新您的原始答案和任何澄清。 – kryger 2017-02-22 16:10:38

1

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

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

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