當前端以 application/json 格式發送請求時,SpringMVC 預設的表單綁定機制無法自動解析請求體。此時必須搭配 @RequestBody 註解,將 HTTP 請求體直接映射為 Java 物件。本文深入解析此機制的運作原理、正確使用姿勢與常見錯誤排查。
關鍵在於設定 contentType: "application/json;charset=utf-8" 並使用 JSON.stringify() 序列化資料:
<script>
$(document).ready(function() {
var saveDataAry = [];
saveDataAry.push({ "userName": "test", "address": "gz" });
saveDataAry.push({ "userName": "ququ", "address": "gr" });
$.ajax({
type: "PUT",
url: "/user",
dataType: "json",
contentType: "application/json;charset=utf-8", // 關鍵:宣告傳送格式
data: JSON.stringify(saveDataAry), // 關鍵:序列化為 JSON 字串
success: function(data) {
console.log("批次儲存成功");
}
});
});
</script>
使用 @RequestBody 直接綁定為 List<User>:
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@PutMapping
@ResponseBody
public void saveUser(@RequestBody List<User> users) {
userService.batchSave(users);
}
}
| 項目 | 說明 |
|---|---|
| HttpMessageConverter | SpringMVC 內建 MappingJackson2HttpMessageConverter 自動將 JSON 反序列化為 Java 物件 |
| @RequestBody 作用 | 告訴 Spring 直接讀取 Request Body 而非 Parameter Map |
| 必要條件 | classpath 下需有 Jackson 相關 jar(spring-boot-starter-web 已包含) |
application/json 導致轉換器不啟動jackson-databindpublic class OrderRequest {
private String orderNo;
private User user; // 巢狀物件
private List<OrderItem> items; // 巢狀集合
// getter/setter
}
@PostMapping("/order")
public void createOrder(@RequestBody OrderRequest request) { ... }
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
@JsonIgnoreProperties(ignoreUnknown = true)
public class User { ... }
@RequestBody 是 SpringMVC 處理 RESTful API 請求的核心註解。掌握其運作機制、正確設定 Content-Type、善用 Jackson 註解客製化序列化行為,能有效避免 400 錯誤並提升開發效率。實務上建議搭配統一異常處理(@ControllerAdvice)攔截 HttpMessageNotReadableException 回傳友善錯誤訊息。