多个 ajax 数据到 Spring MVC 控制器

Posted

技术标签:

【中文标题】多个 ajax 数据到 Spring MVC 控制器【英文标题】:Multiple ajax data to Spring MVC controller 【发布时间】: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") 不,很遗憾它没有帮助。 【参考方案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
    
)

【讨论】:

以上是关于多个 ajax 数据到 Spring MVC 控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Json 对象从 ajax 传递到 spring mvc 控制器?

如何使用 Ajax 以数组格式将多个图像从 MVC 视图发送到控制器?

从spring mvc控制器返回一个简单的映射结构到ajax

将多个参数从 ajax post 传递到 asp.net mvc 控制器

如何将多个参数从 ajax 调用传递到 MVC 控制器

弹出mvc控制器的AJAX后请求中出现未知错误