繁体   English   中英

多个ajax数据到Spring MVC控制器

[英]Multiple ajax data to Spring MVC controller

我需要通过 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})

我做错了什么?

那行不通。 首先让我们澄清@RequestBody 和@RequestParam 之间的区别。

@RequestBody方法参数注解应使用HttpMessageConverter 将HTTP 请求正文中的json 值绑定到java 对象。 HttpMessageConverter 负责将 HTTP 请求消息转换为关联的 java 对象。 来源

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

来到你的问题......使用第一个 ajax 请求,你将 JSON 发送到你的控制器而不是请求参数,所以 @RequestBody 是可以的。

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

那么,如何有第二个论点呢?

您不能使用两个@RequestBody,例如:

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

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

因此,您的解决方案是将其作为请求参数-@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();
}

并更改您的请求 URL,如下所示:

$.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();
}

并更改您的请求 URL,如下所示:

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

要将参数转换为方法参数,您必须使用@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();
}

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

$.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
    }
})

暂无
暂无

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

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