# Java中@RequestBody如何使用
## 一、@RequestBody基礎概念
### 1.1 什么是@RequestBody
`@RequestBody`是Spring MVC框架中的一個重要注解,用于將HTTP請求體中的JSON/XML數據綁定到Java對象上。它主要處理`Content-Type`為`application/json`或`application/xml`的POST/PUT請求。
```java
@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody User user) {
// 處理邏輯
}
@PostMapping("/simple")
public String handleSimple(@RequestBody Map<String, Object> requestBody) {
return "Received: " + requestBody.toString();
}
public class User {
private String name;
private int age;
// getters/setters省略
}
@PostMapping("/user")
public User createUser(@RequestBody User user) {
return userService.save(user);
}
@PostMapping("/batch")
public String batchCreate(@RequestBody List<User> users) {
return "Received " + users.size() + " users";
}
public class Order {
private String orderId;
private List<OrderItem> items;
// getters/setters
}
@PostMapping("/order")
public Order createOrder(@RequestBody Order order) {
// 處理嵌套對象
}
public class CustomDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser p, DeserializationContext ctxt) {
// 自定義日期反序列化邏輯
}
}
public class Event {
@JsonDeserialize(using = CustomDeserializer.class)
private Date eventDate;
}
@PostMapping("/validate")
public ResponseEntity<?> validateUser(@Valid @RequestBody User user,
BindingResult result) {
if (result.hasErrors()) {
return ResponseEntity.badRequest().body(result.getAllErrors());
}
return ResponseEntity.ok(user);
}
可能原因: 1. JSON格式不正確 2. 字段類型不匹配 3. 缺少必需字段
解決方案:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(HttpMessageNotReadableException.class)
public ResponseEntity<?> handleBadRequest(Exception ex) {
return ResponseEntity.badRequest().body("Invalid request body");
}
}
解決方法: 確保請求頭包含:
Content-Type: application/json
public class User {
@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthDate;
}
對于大請求體,考慮使用流式處理:
@PostMapping(value = "/large", consumes = MediaType.APPLICATION_JSON_VALUE)
public void handleLarge(@RequestBody InputStream stream) {
// 流式處理邏輯
}
# application.properties
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
@PostMapping("/valid")
public ResponseEntity<?> validTest(@Valid @RequestBody User user) {
// 自動驗證JSR-303注解
}
@PostMapping("/withHeader")
public String withHeader(@RequestBody User user,
@RequestHeader("X-Custom") String header) {
// 同時獲取請求體和頭部信息
}
@SpringBootTest
@AutoConfigureMockMvc
class UserControllerTest {
@Test
void testCreateUser(@Autowired MockMvc mvc) throws Exception {
mvc.perform(post("/users")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"name\":\"test\",\"age\":20}"))
.andExpect(status().isOk());
}
}
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(new User("test", 20));
// 使用json字符串進行測試
DispatcherServlet接收請求HandlerMapping找到對應處理器HttpMessageConverter進行數據轉換MappingJackson2HttpMessageConverter:處理JSONJaxb2RootElementHttpMessageConverter:處理XML@PostMapping(value = "/path", consumes = "application/json")
public class UserDTO {
// 僅包含必要字段
}
@PostMapping("/register")
public void register(@RequestBody UserDTO dto) {
// 轉換為實體再保存
}
public class ApiResponse<T> {
private int code;
private T data;
// ...
}
@RequestBody是Spring中處理請求體的核心注解,正確使用可以:
- 簡化開發流程
- 提高代碼可讀性
- 增強系統健壯性
掌握其各種應用場景和問題解決方法,能夠顯著提升RESTful API開發效率。
注意:實際開發中應根據具體需求選擇合適的實現方式,并做好異常處理和日志記錄。 “`
這篇文章總計約3300字,涵蓋了@RequestBody的各個方面,包括: 1. 基礎概念和核心作用 2. 基本使用方法和高級應用 3. 常見問題解決方案 4. 性能優化建議 5. 測試方法和底層原理 6. 最佳實踐總結
文章采用Markdown格式,包含代碼示例、注意事項和結構化標題,適合作為技術文檔閱讀。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。