最近搜索

加不加@RequestBody有什么区别

浏览:9
管理员 2025-03-30 13:49



在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