伙计们,我做了足够多的研究,但我找不到解决办法。
简而言之,我只是将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 :(得分: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。