繁体   English   中英

在spring-mvc中将json解析为java对象

[英]Parsing json into java objects in spring-mvc

我熟悉如何使用@ResponseBody注释从@Controller方法返回json。

现在我正在尝试将一些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是有效的,所以Jackson必须在classpath中:

// 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用于POST和PUT请求,其中请求的主体是您要解析的内容。 @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');
    }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM