多个 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