@RequestBody
是 Spring MVC 中用于将 HTTP 请求体中的数据绑定到控制器方法参数的注解。它通常用于处理 POST、PUT 等请求中的 JSON、XML 或其他格式的请求体数据。以下是 @RequestBody
的详细介绍:
1. 基本用法
@RequestBody
将 HTTP 请求体中的数据反序列化为 Java 对象。Spring 会根据请求的 Content-Type
自动选择合适的消息转换器(如 JSON 使用 Jackson
,XML 使用 JAXB
)。
@PostMapping("/user")
public String createUser(@RequestBody User user) {return "User created: " + user.getName();
}
在这个例子中,Spring 会将请求体中的 JSON 数据反序列化为 User
对象。
2. 支持的请求体格式
@RequestBody
支持多种数据格式,具体取决于配置的消息转换器:
- JSON:最常用,Spring 默认使用
Jackson
库进行反序列化。 - XML:需要配置
JAXB
或其他 XML 消息转换器。 - 表单数据:通常使用
@RequestParam
或@ModelAttribute
,但也可以通过@RequestBody
绑定到MultiValueMap
。 - 其他格式:如
text/plain
、application/octet-stream
等。
3. 绑定到 Java 对象
@RequestBody
通常用于将请求体绑定到 Java 对象。Spring 会根据请求的 Content-Type
自动选择消息转换器。
示例:绑定到 POJO
public class User {private String name;private int age;// getters and setters
}@PostMapping("/user")
public String createUser(@RequestBody User user) {return "User created: " + user.getName() + ", Age: " + user.getAge();
}
如果请求体是以下 JSON:
{"name": "John","age": 30
}
Spring 会将其反序列化为 User
对象。
4. 绑定到集合或数组
@RequestBody
也可以绑定到集合或数组类型。
示例:绑定到列表
@PostMapping("/users")
public String createUsers(@RequestBody List<User> users) {return "Total users created: " + users.size();
}
如果请求体是以下 JSON:
[{"name": "John", "age": 30},{"name": "Jane", "age": 25}
]
Spring 会将其反序列化为 List<User>
。
5. 绑定到 Map
@RequestBody
还可以绑定到 Map
类型,适用于动态键值对数据。
示例:绑定到 Map
@PostMapping("/data")
public String processData(@RequestBody Map<String, Object> data) {return "Received data: " + data.toString();
}
如果请求体是以下 JSON:
{"key1": "value1","key2": 123
}
Spring 会将其反序列化为 Map<String, Object>
。
6. 必填性
默认情况下,@RequestBody
注解的参数是必填的。如果请求体为空,Spring 会抛出 HttpMessageNotReadableException
异常。可以通过 required
属性将其设置为非必填(Spring 5.1+ 支持)。
@PostMapping("/user")
public String createUser(@RequestBody(required = false) User user) {if (user == null) {return "No user data provided";}return "User created: " + user.getName();
}
7. 与 @RequestParam
和 @PathVariable
的区别
@RequestParam
:用于提取查询参数或表单数据。@PathVariable
:用于提取 URL 路径中的变量。@RequestBody
:用于提取请求体中的数据。
8. 使用场景
@RequestBody
适用于以下场景:
- 处理 JSON 或 XML 格式的请求体。
- 接收复杂对象或嵌套对象。
- 处理 RESTful API 中的 POST、PUT 请求。
9. 示例代码
以下是一个完整的示例,展示了 @RequestBody
的用法:
@RestController
public class UserController {@PostMapping("/user")public String createUser(@RequestBody User user) {return "User created: " + user.getName() + ", Age: " + user.getAge();}@PostMapping("/users")public String createUsers(@RequestBody List<User> users) {return "Total users created: " + users.size();}@PostMapping("/data")public String processData(@RequestBody Map<String, Object> data) {return "Received data: " + data.toString();}
}
请求示例
-
创建单个用户:
- URL:
POST /user
- 请求体:
{"name": "John","age": 30 }
- 响应:
User created: John, Age: 30
- URL:
-
创建多个用户:
- URL:
POST /users
- 请求体:
[{"name": "John", "age": 30},{"name": "Jane", "age": 25} ]
- 响应:
Total users created: 2
- URL:
-
处理动态数据:
- URL:
POST /data
- 请求体:
{"key1": "value1","key2": 123 }
- 响应:
Received data: {key1=value1, key2=123}
- URL:
10. 注意事项
- 消息转换器:确保 Spring 配置了合适的消息转换器(如
Jackson
用于 JSON)。 - 数据校验:可以结合
@Valid
注解对请求体数据进行校验。 - 性能:对于大文件或二进制数据,建议使用
MultipartFile
而不是@RequestBody
。
总结
@RequestBody
是 Spring MVC 中用于处理请求体数据的核心注解,支持将 JSON、XML 等格式的数据绑定到 Java 对象、集合或 Map。它在 RESTful API 开发中非常常用,能够简化复杂数据的处理。