我熟悉如何从我的 @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');
    }
});
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top