首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

SpringMVC @RequestBody 接收 JSON 字串完整解析與實戰

     編輯:Java 相關知識

前言

當前端以 application/json 格式發送請求時,SpringMVC 預設的表單綁定機制無法自動解析請求體。此時必須搭配 @RequestBody 註解,將 HTTP 請求體直接映射為 Java 物件。本文深入解析此機制的運作原理、正確使用姿勢與常見錯誤排查。

前端發送 JSON 的正確姿勢

關鍵在於設定 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>

後端 Controller 接收

使用 @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);
    }
}

核心原理解析

項目說明
HttpMessageConverterSpringMVC 內建 MappingJackson2HttpMessageConverter 自動將 JSON 反序列化為 Java 物件
@RequestBody 作用告訴 Spring 直接讀取 Request Body 而非 Parameter Map
必要條件classpath 下需有 Jackson 相關 jar(spring-boot-starter-web 已包含)

常見 400 Bad Request 錯誤原因與解決

  1. JSON 格式錯誤:屬性名缺雙引號、多逗號、型別不符(如傳字串給 Integer 欄位)
  2. Content-Type 未設定:缺少 application/json 導致轉換器不啟動
  3. 資料結構不匹配:前端傳陣列、後端接單一物件,或欄位名稱不一致
  4. 缺少 Jackson 依賴:傳統 SpringMVC 需手動引入 jackson-databind

進階技巧

1. 接收巢狀物件

public class OrderRequest {
    private String orderNo;
    private User user;           // 巢狀物件
    private List<OrderItem> items; // 巢狀集合
    // getter/setter
}

@PostMapping("/order")
public void createOrder(@RequestBody OrderRequest request) { ... }

2. 日期格式自訂

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;

3. 忽略未知欄位

@JsonIgnoreProperties(ignoreUnknown = true)
public class User { ... }

總結

@RequestBody 是 SpringMVC 處理 RESTful API 請求的核心註解。掌握其運作機制、正確設定 Content-Type、善用 Jackson 註解客製化序列化行為,能有效避免 400 錯誤並提升開發效率。實務上建議搭配統一異常處理(@ControllerAdvice)攔截 HttpMessageNotReadableException 回傳友善錯誤訊息。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved