30

我熟悉如何使用注释从我的@Controller方法中返回 json。@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 有效,因此 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);
    }

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

4

2 回答 2

45

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

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

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

尝试删除@RequestParam并查看是否有效。如果不是,并且您确实将 JSON 作为请求参数发布,那么 Spring 将不会帮助您在没有额外管道的情况下处理它(请参阅自定义 WebDataBinder 初始化)。

于 2010-10-13T08:06:15.250 回答
4

如果您在客户端使用 jquery,这对我有用:

爪哇:

@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');
    }
});
于 2012-08-12T13:40:02.810 回答