java - 多个 ajax 数据到 Spring MVC Controller

标签 java json ajax spring-mvc

我需要通过 ajax 将数据发送到 Spring MVC Controller 。但如果我发送多个参数, Controller 将无法工作。

Controller 方法:

@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
            }
        })

但如果我更改数据参数,那么 Controller 甚至不会收到请求。

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

我做错了什么?

最佳答案

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

@RequestBody方法参数注解应该使用HttpMessageConverter将HTTP请求体中的json值绑定(bind)到java对象上。 HttpMessageConverter 负责将 HTTP 请求消息转换为关联的 java 对象。 Source

并使用 @RequestParam注释将请求参数绑定(bind)到 Controller 中的方法参数。 Source

来问你的问题... 对于第一个 ajax 请求,您将 JSON 发送到您的 Controller 而不是请求参数,所以 @RequestBody 没问题。

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

那么,如何有第二个参数呢?

你不能像这样使用两个@RequestBody:

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

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

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

关于java - 多个 ajax 数据到 Spring MVC Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35081042/

相关文章:

javascript - 如何防止查询字符串值可见

javascript - 无法从响应中提取ajax成功函数变量

javascript - 涉及 jQuery Ajax 请求的内存泄漏

java - 从bat文件设置类路径不起作用

java - 避免 SocketTimeoutException 的最佳方法是什么?

java - 可扩展的 ByteBuffer 相当于支持小端写/读?

c++ - 适用于C++的wso2 Web服务框架中的JSON支持

从云 API 提取数据的 Java 代码

javascript - 如何访问匿名 JSON 属性?

mysql - 选择MySQL表中JSON类型值的计数