【问题标题】:Multiple ajax data to Spring MVC controller多个 ajax 数据到 Spring MVC 控制器
【发布时间】:2016-05-06 23:35:22
【问题描述】:

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

我做错了什么?

【问题讨论】:

  • 在控制器方法的第二个参数前添加@RequestParam("id")
  • 不,很遗憾它没有帮助。

标签: java json ajax spring-mvc


【解决方案1】:

那是行不通的。首先让我们澄清@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 控制器。相反,您必须将其包装在单个对象中。

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

【讨论】:

  • 我面临同样的问题。 @Shaheer 你的解决方案很好,但我想传递像data: ({'fieldBean': JSON.stringify(fieldBean.data), 'id': id}) 这样的数据我不想在 URL 中传递数据。那么你对此有什么想法吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-09-27
      • 2013-05-08
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 2017-05-08
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多