@RequestBody 是 Spring MVC(含 Spring Boot)核心注解之一,核心作用是 告知 Spring 框架:从 HTTP 请求体(Request Body)中读取数据,并自动反序列化为目标 Java 对象,专门用于接收前端传递的 JSON/XML 等格式的请求体数据。
一、核心功能拆解(通俗理解)
可以把 @RequestBody 理解为 “请求体数据的搬运工 + 格式转换器”,主要做两件事:
数据来源定位:明确告知 Spring,数据不在 URL 上(不是 @RequestParam 或 @PathVariable 对应的参数),而是在 HTTP 请求的「请求体(Body)」里;
自动反序列化:Spring 会根据请求头 Content-Type(如 application/json),调用对应的「消息转换器」(默认是 MappingJackson2HttpMessageConverter),将请求体中的文本数据(如 JSON 字符串)转换成你指定的 Java 对象(如 User、List 等),无需手动解析。
二、关键使用场景(必须用 @RequestBody 的情况)
当满足以下条件时,必须使用 @RequestBody:
前端传递的是 JSON/XML 格式数据(请求头 Content-Type: application/json 或 application/xml);
数据放在 请求体(Body) 中(前后端分离项目的主流传递方式);
后端需要接收 复杂对象(如嵌套对象、集合、数组等),而非简单的键值对。
典型示例(前后端分离主流场景)
前端(Axios 发 JSON 请求):
javascript
运行
axios.post(“/api/user/save”, {
name: “张三”,
age: 20,
address: { province: “广东”, city: “深圳” } // 嵌套对象
}, {
headers: { “Content-Type”: “application/json” } // 明确 JSON 格式
});
后端(@RequestBody 接收并自动转换):
java
运行
@RestController
public class UserController {
// 用 @RequestBody 将 JSON 请求体转为 User 对象
@PostMapping(“/api/user/save”)
public String saveUser(@RequestBody User user) {
System.out.println(user.getName()); // 直接获取转换后的属性:张三
System.out.println(user.getAddress().getCity()); // 嵌套属性:深圳
return “success”;
}
// 实体类(字段名与 JSON 键一致)
static class User {
private String name;
private Integer age;
private Address address; // 嵌套对象
// getter + setter(必须有,Spring 反射赋值需要)
}
static class Address {
private String province;
private String city;
// getter + setter
}
}
三、核心特性(为什么必须用它?)
支持复杂数据结构:可直接接收 JSON 格式的嵌套对象、集合、数组(如 List<User>、User[]、Map<String, Object> 等),无需手动处理层级关系;
自动格式适配:
前端传 application/json(JSON 格式):依赖 jackson-databind 自动反序列化(Spring Boot 默认引入);
前端传 application/xml(XML 格式):引入 jackson-dataformat-xml 依赖后,可自动反序列化为 Java 对象;
字段映射灵活:支持用 @JsonProperty 处理 JSON 键与 Java 字段名不一致的情况(如 JSON 是 user_name,Java 是 userName):
java
运行
static class User {
@JsonProperty(“user_name”) // JSON 键是 user_name,映射到 userName 字段
private String userName;
// getter + setter
}
四、与其他参数注解的区别(避坑关键)
许多人混淆 @RequestBody 与 @RequestParam/@ModelAttribute,核心区别在于 数据来源和解析方式,用表格清晰对比:
注解 数据来源 支持格式 适用场景
@RequestBody HTTP 请求体(Body) JSON/XML 等文本格式 复杂对象、嵌套结构、前后端分离 JSON 传输
@RequestParam URL 参数 / 表单参数 键值对(key=value) 简单参数(String、Integer 等)
@ModelAttribute URL 参数 / 表单参数 键值对(key=value) 简单 Java Bean(无嵌套的键值对)
关键避坑点:
若前端发 JSON 格式请求(Content-Type: application/json),后端用 @RequestParam 或 @ModelAttribute 接收,会直接失败(无法解析 JSON 格式);
若前端发表单格式请求(Content-Type: application/x-www-form-urlencoded),后端用 @RequestBody 接收,也会失败(请求体是 key=value 格式,不是 JSON/XML)。
五、常见使用注意事项
依赖必须存在:接收 JSON 时,需确保项目有 jackson-databind 依赖(Spring Boot 项目引入 spring-boot-starter-web 后默认包含),否则会报「无法解析请求体」异常;
请求头必须匹配:前端需设置 Content-Type: application/json(Axios 发对象时默认自动设置,若手动传字符串需显式指定);
Java Bean 必须有 getter/setter:Spring 通过反射赋值,无 getter/setter 会导致字段为 null;
可选性配置:若参数可空,可加 required = false(默认 required = true,请求体为空时会报错):
java
运行
// 允许请求体为空,user 可能为 null
public String saveUser(@RequestBody(required = false) User user) { … }
数组 / 集合接收:可直接接收 JSON 数组,无需额外包装:
java
运行
// 前端传 JSON 数组:[{“name”:”张三”},{“name”:”李四”}]
@PostMapping(“/api/user/batchSave”)
public String batchSave(@RequestBody List<User> userList) { … }
总结
@RequestBody 的核心作用是 “读取请求体数据 + 自动反序列化为 Java 对象”,是前后端分离项目中接收 JSON 格式复杂数据的 唯一标准方式。它解决了手动解析 JSON 字符串的繁琐工作,让数据绑定更高效、代码更简洁,是 Spring 生态中处理请求体数据的核心注解。