【问题标题】:Parsing json into java objects in spring-mvc在spring-mvc中将json解析为java对象
【发布时间】:2011-04-24 17:14:21
【问题描述】:

我熟悉如何使用 @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 必须在类路径中:

// 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);
    }

有什么想法吗?我是否正在尝试做一些不受支持的事情?

【问题讨论】:

    标签: java json spring-mvc jackson


    【解决方案1】:

    您的参数应该是@RequestParam@RequestBody,而不是两者。

    @RequestBody 用于 POST 和 PUT 请求,其中请求的主体是您要解析的内容。 @RequestParam 用于命名参数,可以在 URL 上或作为多部分表单提交。

    所以你需要决定你需要哪一个。您真的希望将 JSON 作为请求参数吗?这通常不是 AJAX 的工作方式,它通常作为请求正文发送。

    尝试删除@RequestParam 看看是否可行。如果不是,并且您确实将 JSON 作为请求参数发布,那么 Spring 将无法帮助您在没有额外管道的情况下处理它(请参阅 Customizing WebDataBinder initialization)。

    【讨论】:

    • +1,你打败了我。但是,还有一件事是确保客户端将请求Content-Type 设置为application/json?尝试使用 @RequestBody,然后删除 @RequestParam,正如 skaffman 最初建议的那样。
    • 刚才我删除了@RequestBody 注释并将参数作为GET 参数发送:http://localhost:8080/my-app/ajax/search/sync?json={"foo"%3A"bar"} 但我得到了同样的错误。
    • @oksayt:正如我所说,如果您想使用 @RequestParam 解析 JSON,您将必须自定义数据绑定,如链接中所述。
    • 啊,我明白了。现在我删除了@RequestParam,重新添加了@RequestBody,现在我将参数作为POST 表单发送(因此POST 正文是以json= 为前缀的json 字符串)。但我仍然遇到同样的错误。
    • @oksayt:你不需要json=,它是多余的。您只需要正文中的 JSON 文本。哦,您还需要 <mvc:annotation-driven/> 以获得杰克逊支持(请参阅 static.springsource.org/spring/docs/3.0.x/…
    【解决方案2】:

    如果您在客户端使用 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');
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2015-01-20
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多