我想通过AJAX发出POST请求,我还希望将整个类对象绑定到请求,并希望通过@requestParam
注释接收该请求。我知道可以使用@requestBody
注释来完成,但我很想知道:我们可以使用@requestParam
注释来完成吗?
Ajax代码:
var restDTO{
id: 3,
name: "hello"
}
$.ajax({
url: url,
type: 'POST',
dataType: 'json',
contentType: 'application/json',
mimeType: 'application/json',
data: JSON.stringify({RestDTO : restDTO}),
success: function(data)
{
}
我确实有RestDTO
Class RestDTO
{
int id;
String name;
//getter and setter
}
在控制器中
public String content(@RequestParam RestDTO restDTO){...}
我应该怎么做才能运行此代码?
从ajax发送数据应该更改什么?
我是否需要在服务器上更改以接收带@requestParam
注释的RestDto对象?
答案 0 :(得分:14)
您不能,因为@RequestParam
只是表明,一个方法的参数应该绑定到一个 Web请求&# 39; s参数。它无法映射到对象。要使用@RequestParam
,您应该更改ajax请求:
var restDTO{
id: 3,
name: "hello"
}
$.ajax({
url: url,
type: 'POST',
data: restDTO,
success: function(data){
....
}
});
JQuery将以application/x-www-form-urlencoded
的形式发送请求,并自动将数据处理为参数。您的控制器方法应如下所示:
@RequestMapping("/url")
public String content(@RequestParam Long id, @RequestParam String name){...}
要自动将参数映射到对象,您可以使用@ModelAttribute
注释:
@RequestMapping("/url")
public String content(@ModelAttribute RestDTO restDTO){...}
在这种情况下,javascript地图中的名称应与RestDTO
中的属性名称匹配。
通常,@ModelAttribute
和@RequestBody
创建用于相同目的:用于将数据从请求绑定到方法(是否为基本类型的对象)。
我认为,当您使用html表单和普通对象时,@ModelAttribute
更方便。可以使用像modelAttribute
和path
这样的Spring功能。
当您需要手动控制数据时,@RequestBody
更灵活。此外,当您使用复杂对象时,它会更方便。
我个人更喜欢@RequestBody
和json。
答案 1 :(得分:8)
如果您将数据作为经典请求参数发送,则只需省略@RequestParam
就可以绑定到对象,所以
public String content(RestDTO restDTO){...}
如果您要发送json
,则必须使用@RequestBody
。
如果您坚持使用@RequestParam
,请注意您可以针对地图绑定多个值,所以
public String content(@RequestParam Map<String, String> restDTO){...}
来自@RequestParam
doc
如果方法参数是Map或 未指定MultiValueMap和参数名称, 然后使用所有请求参数名称填充map参数 和价值观。
答案 2 :(得分:3)
在春季网站上,您有这些注释:
RequestParam - 用于获取参数(/ path?name =)
PathVariable - 用于路径参数(/ path / {name})
RequestBody - 用于post / put / patch等身体
RequestHeader - 标题
所以你不能将RequestParam用于后期参数,如果不是json则不重要