在Spring MVC中,加不加@RequestBody注解对参数绑定的处理方式有本质区别,具体差异如下:
数据来源不同
加@RequestBody:从请求体(如JSON、XML等)中获取数据,并自动反序列化为BigType对象。适用于POST/PUT请求中传输结构化数据的情况。
不加@RequestBody:从URL参数或表单数据中获取键值对,通过@ModelAttribute默认绑定到XiaoshouHead对象。适用于传统表单提交或GET请求。
Content-Type要求不同
加@RequestBody:要求请求头Content-Type为application/json或application/xml等非表单格式,否则会抛出415错误。
不加@RequestBody:默认处理application/x-www-form-urlencoded或multipart/form-data格式,参数通过URL或表单字段传递。
数据解析机制不同
加@RequestBody:依赖HttpMessageConverter(如MappingJackson2HttpMessageConverter)完成数据到对象的转换,支持复杂嵌套结构。
不加@RequestBody:通过DataBinder按字段名匹配绑定,无法直接处理多层嵌套的JSON数据。
适用场景对比
加@RequestBody的save方法:适合RESTful API中接收前端传递的JSON对象,如通过Ajax或Postman发送的请求。
不加@RequestBody的add方法:适合传统表单提交或简单参数传递,例如HTML表单或URL拼接参数。
示例说明
当请求为POST /save且携带JSON:{"name":"类型1","createTime":"2025-03-30"}时,@RequestBody能正确映射到BigType对象。
若请求为POST /add?name=测试&amount=100,则XiaoshouHead会通过表单参数完成属性填充。
这种方式不加@RequestBody
$.post("/admin/xiaoshou/head/add",
{remark: remark, client: client, phone: phone, address: address},
function(result) {},
"json"
);
这种方式加@RequestBody
$.ajax({
url: "/admin/xiaoshou/head/add",
type: "POST",
contentType: "application/json", // 明确声明JSON格式:ml-citation{ref="1,8" data="citationList"}
data: JSON.stringify({ // 序列化为JSON字符串:ml-citation{ref="1,8" data="citationList"}
remark: remark,
client: client,
phone: phone,
address: address
}),
dataType: "json",
success: function(result) {}
});
contentType
参数:必须设置为application/json
,否则后端无法通过@RequestBody
解析18。
JSON.stringify()
:将对象序列化为JSON字符串,避免传输格式错误18。
站长微信:xiaomao0055
站长QQ:14496453