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

Spring MVC @RequestBody 與 @ResponseBody 註解深度解析與 JSON 整合實戰

     編輯:Java 相關知識

核心概念:為什麼需要這兩個註解?

在前後端分離架構下,JSON 已成為事實標準的資料交換格式。Spring MVC 透過 @RequestBody 與 @ResponseBody 註解,配合 Jackson 庫,實現了 HTTP 請求/回應體與 Java 物件的自動雙向轉換,徹底消除手動序列化/反序列化的樣板程式碼。

環境準備:Maven 依賴與配置

Jackson 依賴 (Spring Boot 專案通常內建,無需額外引入)

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>

Spring MVC 核心配置

<mvc:annotation-driven />

@RequestBody:請求體自動反序列化

場景一:簡單平層 JSON → Map

前端 AJAX 請求:

$.ajax({
    type: "POST",
    url: "/testRequestBody",
    dataType: "json",
    data: { name: "韋德", age: 35 },
    success: function(result) { console.log(result); }
});

後端處理:

@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestParam Map<String, Object> map) {
    System.out.println(map); // {name=韋德, age=35}
    return "index";
}
注意:簡單平層 JSON 可直接用 @RequestParam Map 接收,無需 @RequestBody

場景二:複雜巢狀 JSON → 物件 (必須使用 @RequestBody)

前端 AJAX 請求:

$.ajax({
    type: "POST",
    url: "/testRequestBody",
    contentType: "application/json",  // 關鍵:必須設定
    data: JSON.stringify({           // 關鍵:必須序列化為字串
        name: "韋德",
        win: [2006, 2012, 2013],
        age: 35
    }),
    success: function(result) { console.log(result); }
});

後端處理:

@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody Map<String, Object> map) {
    System.out.println(map); // {name=韋德, win=[2006, 2012, 2013], age=35}
    return "index";
}

關鍵要求總結

條件說明
Content-Type必須為 application/json
資料格式必須為 JSON 字串 (使用 JSON.stringify())
參數類型Map、自定義 POJO、List 等

@ResponseBody:回應體自動序列化

傳統手寫 JSON 回應 (繁瑣且易錯)

private void writeJson(HttpServletResponse response, Object object) {
    String json = JSON.toJSONString(object); // 需額外引入 fastjson/jackson
    response.setCharacterEncoding("UTF-8");
    response.setContentType("application/json; charset=utf-8");
    try (PrintWriter out = response.getWriter()) {
        out.write(json);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

使用 @ResponseBody 簡化 (一行搞定)

前端調用:

$.ajax({
    type: "POST",
    url: "/testResponseBody",
    dataType: "json",
    success: function(result) { console.info(result); }
});

後端處理:

@RequestMapping("/testResponseBody")
@ResponseBody
public Map<String, Object> testResponseBody() {
    Map<String, Object> result = new HashMap<>();
    result.put("name", "韋德");
    result.put("age", 35);
    return result; // 自動轉為 JSON: {"age":35,"name":"韋德"}
}

進階應用:搭配實體類別

public class User {
    private String name;
    private int age;
    private List<String> hobbies;
    // getter/setter 省略
}

@PostMapping("/user")
@ResponseBody
public User createUser(@RequestBody User user) {
    // 直接獲得完整物件,自動驗證可加 @Valid
    userService.save(user);
    return user; // 自動序列化回傳
}

流程圖總結

Spring MVC JSON 處理流程圖

常見坑點與解決方案

問題原因解決
400 Bad RequestContent-Type 錯誤或 JSON 格式不合法檢查前端 contentType 與 JSON.stringify()
字段為 nullJSON key 與 Java 屬性名不匹配使用 @JsonProperty 或確保駝峰命名一致
日期格式錯誤預設時間戳格式配置 ObjectMapper 日期格式
循環引用錯誤雙向關聯實體序列化使用 @JsonIgnore 或 @JsonBackReference

最佳實踐建議

  1. 統一使用 DTO:Controller 層專用資料傳輸物件,與領域模型解耦
  2. 啟用驗證:@Valid @RequestBody UserDTO dto 配合 JSR-303 註解
  3. 全域異常處理:@ControllerAdvice 捕獲 HttpMessageNotReadableException 回傳友善錯誤
  4. 配置 ObjectMapper:統一日期格式、忽略 null 字段、駝峰/下劃線轉換

掌握 @RequestBody 與 @ResponseBody 是 Spring MVC 開發的核心技能,配合 Jackson 強大的序列化能力,能讓你專注於業務邏輯而非資料轉換細節,大幅提升開發效率與程式碼品質。

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