将JSON解析为Spring-MVC中的Java对象
-
29-09-2019 - |
题
我熟悉如何从我的 @Controller
使用 @ResponseBody
注解。
现在,我正在尝试在控制器中阅读一些JSON论点,但到目前为止还没有运气。这是我的控制器的签名:
@RequestMapping(value = "/ajax/search/sync")
public ModelAndView sync(@RequestParam("json") @RequestBody SearchRequest json) {
但是,当我尝试调用这种方法时,Spring抱怨说:Failed to convert value of type 'java.lang.String' to required type 'com.foo.SearchRequest'
删除 @RequestBody
注释似乎没有什么不同。
手动解析JSON的作品,因此杰克逊必须在班级路径中:
// This works
@RequestMapping(value = "/ajax/search/sync")
public ModelAndView sync(@RequestParam("json") String json) {
SearchRequest request;
try {
request = objectMapper.readValue(json, SearchRequest.class);
} catch (IOException e) {
throw new IllegalArgumentException("Couldn't parse json into a search request", e);
}
有任何想法吗?我是否想做不支持的事情?
解决方案
您的参数应该是 @RequestParam
, 或者 一种 @RequestBody
, , 不是都。
@RequestBody
用于与邮政请求一起使用,在此请求的正文是您要解析的地方。 @RequestParam
用于命名参数,无论是在URL还是作为多部分表单提交。
因此,您需要决定需要哪个。您真的想让您的JSON作为请求参数吗?这通常不是Ajax的工作原理,通常是作为请求主体发送的。
尝试删除 @RequestParam
看看是否有效。如果没有,您确实将JSON作为请求参数发布,那么Spring不会帮助您处理,而无需其他管道(请参阅 自定义WebDatabinder初始化).
其他提示
如果您在客户端使用jQuery,这对我有用:
Java:
@RequestMapping(value = "/ajax/search/sync")
public ModelAndView sync(@RequestBody SearchRequest json) {
JQuery(您需要包括Douglas Crockford的JSON2.JS才能具有JSON.STRINGIFY函数):
$.ajax({
type: "post",
url: "sync", //your valid url
contentType: "application/json", //this is required for spring 3 - ajax to work (at least for me)
data: JSON.stringify(jsonobject), //json object or array of json objects
success: function(result) {
//do nothing
},
error: function(){
alert('failure');
}
});
不隶属于 StackOverflow