多个ajax数据到Spring MVC控制器

时间:2016-01-29 09:31:12

标签: java json ajax spring-mvc

我需要通过ajax将数据发送到Spring MVC控制器。但是如果我发送多个参数,控制器就不起作用。

控制器方法:

@Timed
@RequestMapping(value = "saveee", method = RequestMethod.POST)
@ResponseBody
public JsonResultBean saveTicketTemplate(@RequestBody TicketTemplateFieldBean fieldBean, Long id) throws IOException {
    //TODO smth
    return JsonResultBean.success();
}

使用这个ajax代码完全可以正常工作:

$.ajax({
            type: 'POST',
            dataType: 'json',
            contentType: 'application/json',
            url: '/organizer/api/saveee',
            data: JSON.stringify(fieldBean.data),
            success: function(result) {
                //TODO
            }
        })

但是如果我改变数据参数,那么控制器甚至不会得到请求。

data: ({'fieldBean': JSON.stringify(fieldBean.data), 'id': id})

我做错了什么?

3 个答案:

答案 0 :(得分:4)

那不会奏效。首先让我们澄清@RequestBody和@RequestParam之间的区别。

@RequestBody方法参数注释应该使用HttpMessageConverter将HTTP请求主体中的json值绑定到java对象。 HttpMessageConverter负责将HTTP请求消息转换为已声明的java对象。 Source

并使用@RequestParam注释将请求参数绑定到控制器中的方法参数。 Source

来找你问题...... 使用第一个ajax请求,您将向控制器发送JSON而不是请求参数,因此@RequestBody正常。

在第二个ajax请求中,您也发送JSON但有两个字段(fieldBean和id)。由于@RequestBody注释参数应该保存请求的整个主体并绑定到一个对象。您应该修改Java对象(即TicketTemplateFieldBean)以保存id字段。如果控制器中只有一个参数,这将有效。

然后,如何获得第二个参数?

您不能使用两个@RequestBody:

public JsonResultBean saveTicketTemplate(@RequestBody TicketTemplateFieldBean fieldBean, @RequestBody Long id).

因为它只能绑定到单个对象(主体只能被使用一次),所以不能将多个单独的JSON对象传递给Spring控制器。相反,你必须将它包裹在单个对象中。

因此,您的解决方案是将其作为Request参数 - @RequestParam传递,或作为路径变量传递 - @PathVariable。由于@RequestParam和@ModelAttribute仅在将数据作为请求参数提交时才起作用。您应该像这样更改代码:

@Timed
@RequestMapping(value = "saveee", method = RequestMethod.POST)
@ResponseBody
public JsonResultBean saveTicketTemplate(@RequestBody TicketTemplateFieldBean fieldBean, @RequestParam("id") Long id) throws IOException {
    //TODO smth
    return JsonResultBean.success();
}

并按如下方式更改请求网址:

$.ajax({
            type: 'POST',
            dataType: 'json',
            contentType: 'application/json',
            url: '/organizer/api/saveee?id=10',
            data: JSON.stringify(fieldBean.data),
            success: function(result) {
                //TODO
            }
        })

您可以像这样使用@PathVariable:

@Timed
@RequestMapping(value = "saveee/{id}", method = RequestMethod.POST)
@ResponseBody
public JsonResultBean saveTicketTemplate(@RequestBody TicketTemplateFieldBean fieldBean, @PathVariable("id") Long id) throws IOException {
    //TODO smth
    return JsonResultBean.success();
}

并按如下方式更改请求网址:

$.ajax({
            type: 'POST',
            dataType: 'json',
            contentType: 'application/json',
            url: '/organizer/api/saveee/10',
            data: JSON.stringify(fieldBean.data),
            success: function(result) {
                //TODO
            }
        })

答案 1 :(得分:0)

要将参数转换为必须使用@RequestParam的方法参数,所以代码应该像这样修改:

控制器:

@Timed
@RequestMapping(value = "saveee", method = RequestMethod.POST)
@ResponseBody
public JsonResultBean saveTicketTemplate(@RequestParam TicketTemplateFieldBean fieldBean, @RequestParam Long id) throws IOException {
    //TODO smth
    return JsonResultBean.success();
}

答案 2 :(得分:0)

您没有将有效数据传递给控制器​​。尝试这样的事情。

$.ajax({
    type: 'POST',
    dataType: 'json',
    contentType: 'application/json',
    url: '/organizer/api/saveee',
    data: JSON.stringify({
            fieldBean: JSON.stringify(fieldBean.data),
            id: id
    }),
    success: function(result) {
        //TODO
    }
})