Spring MVC @RequestBody 注解怎么用?接收什么格式的數據?

@RequestBody 注解的作用

@RequestBody 將方法上的參數綁定到 HTTP 請求的 Body(請求體)的內容上

當客戶端發送一個包含數據的請求體(通常在 POST, PUT, PATCH 請求中)時,@RequestBody 告訴 Spring MVC 讀取這個請求體,并使用已注冊的 HttpMessageConverter 將其內容**反序列化(Deserialize)**為一個 Java 對象。

簡單來說,它允許我們直接將請求中發送的 JSON、XML 或其他格式的數據映射到一個 Java 對象(通常是一個 POJO - Plain Old Java Object)。

@RequestBody 的工作機制

  1. 讀取請求體: Spring MVC 獲取 HTTP 請求的輸入流。
  2. 檢查 Content-Type Header: 查看請求頭中的 Content-Type,例如 application/jsonapplication/xml。這個 Header 會告訴服務器客戶端發送的是什么格式的數據。
  3. 選擇 HttpMessageConverter: Spring MVC 會查找已注冊的、能夠處理該 Content-Type 的請求體內容轉換為方法參數指定類型的 HttpMessageConverter
  4. 反序列化: HttpMessageConverter 讀取請求體內容,并將其轉換為目標 Java 對象。
  5. 參數綁定: 轉換后的 Java 對象會傳遞給帶有 @RequestBody 注解的方法參數。

常用場景:接收 JSON 或 XML 數據

@RequestBody 最常用于接收客戶端發送的 JSON 或 XML 數據,尤其是在構建 RESTful API 時。

示例:接收 JSON 數據

假設客戶端發送一個 POST 請求到 /api/users,請求體包含以下 JSON 數據:

{"username": "john.doe","email": "john.doe@example.com","age": 30
}

并且請求頭中設置了 Content-Type: application/json

我們可以定義一個對應的 Java POJO:

// User.java (POJO)
public class User {private String username;private String email;private int age;// Getters and Setters (必需,供 Jackson 等庫使用)public String getUsername() { return username; }public void setUsername(String username) { this.username = username; }public String getEmail() { return email; }public void setEmail(String email) { this.email = email; }public int getAge() { return age; }public void setAge(int age) { this.age = age; }@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", email='" + email + '\'' +", age=" + age +'}';}
}

然后在 Controller 中這樣使用 @RequestBody

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpStatus;@RestController
@RequestMapping("/api/users")
public class UserController {@PostMappingpublic ResponseEntity<String> createUser(@RequestBody User user) {// 此時,Spring MVC 已經使用 HttpMessageConverter (通常是 Jackson)// 將請求體中的 JSON 數據轉換為了一個 User 對象實例 'user'System.out.println("Received user: " + user);// 在這里可以進行保存用戶等業務邏輯...// userService.save(user);return ResponseEntity.status(HttpStatus.CREATED).body("User created successfully: " + user.getUsername());}
}

所需依賴

Spring MVC 依賴 HttpMessageConverter 來實現 @RequestBody 的功能。

  1. 處理 JSON (最常用):

    • 依賴庫: Jackson Databind (jackson-databind) 是 Spring Boot 和 Spring MVC 處理 JSON 的默認庫。
    • 如何添加: 如果使用 Spring Boot,spring-boot-starter-web starter 會自動包含 jackson-databind。通常不需要手動添加它。
    • Maven 示例 (如果未使用 Spring Boot Starter 或需要特定版本):
      <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><!-- <version>...</version> --> <!-- Spring Boot 管理版本 -->
      </dependency>
      
    • 替代庫: 雖然不常用,但也可以配置使用其他 JSON 庫,如 Gson (com.google.code.gson:gson) 或 JSON-B。
  2. 處理 XML:

    • 依賴庫:
      • JAXB (Java Architecture for XML Binding): 這是 Java 標準庫的一部分(直到 Java 10,Java 11 及以后需要單獨添加依賴)。Spring 對 JAXB 有內建支持。
      • Jackson XML extension (jackson-dataformat-xml): 這是 Jackson 提供的用于處理 XML 的模塊,與處理 JSON 的方式非常相似,通常更受歡迎,因為它與 Jackson 的其他功能(如注解)集成得更好。
    • 如何添加 (Jackson XML): 如果你想使用 Jackson 處理 XML,需要手動添加 jackson-dataformat-xml 依賴。spring-boot-starter-web 包含它。
    • Maven 示例 (Jackson XML):
      <dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><!-- <version>...</version> --> <!-- Spring Boot 管理版本 -->
      </dependency>
      
    • POJO 注解: 如果使用 JAXB 或 Jackson XML,需要在 POJO 上添加特定的注解(如 @XmlRootElement, @XmlElement for JAXB,或者 Jackson 也可以使用 JAXB 注解或其自己的注解)映射 XML 結構。不過,對于簡單的結構,Jackson XML 也能在沒有額外注解的情況下工作。

示例:Controller 處理 XML (假設已添加 jackson-dataformat-xml)

如果客戶端發送 Content-Type: application/xml 和以下 XML 請求體:

<User><username>jane.doe</username><email>jane.doe@example.com</email><age>28</age>
</User>

上面的 createUser 方法無需修改(只要 User POJO 的結構匹配),Spring MVC 會自動選擇 MappingJackson2XmlHttpMessageConverter(如果 jackson-dataformat-xml 在 classpath 中)來處理請求。

關鍵點和注意事項

  1. Content-Type Header: 客戶端必須發送正確的 Content-Type 請求頭,以便 Spring MVC 知道如何解析請求體并選擇合適的 HttpMessageConverter。如果 Content-Type 不匹配或缺失,通常會導致 HTTP 415 (Unsupported Media Type) 錯誤。
  2. 必需性: @RequestBody 標注的參數默認是必需的。如果請求體為空或無法轉換為目標類型,會拋出 HttpMessageNotReadableException,通常導致 HTTP 400 (Bad Request) 錯誤。
  3. 唯一性: 一個 Controller 方法只能有一個參數使用 @RequestBody 注解,因為一個 HTTP 請求只有一個請求體。
  4. 不要與 @RequestParam 混淆: @RequestParam 用于獲取 URL 查詢參數或表單數據(application/x-www-form-urlencoded),而 @RequestBody 用于獲取整個請求體的內容(通常是 JSON 或 XML)。
  5. Validation: 通常會結合 Java Bean Validation API (JSR 380/303) 使用 @RequestBody。通過在 @RequestBody 參數前添加 @Valid 注解,可以自動觸請求體反序列化后的對象的校驗。
import javax.validation.Valid;
import javax.validation.constraints.Email;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;// User.java (帶校驗注解)
public class User {@NotBlank(message = "Username cannot be blank")private String username;@NotBlank@Email(message = "Invalid email format")private String email;@Min(value = 0, message = "Age must be positive")private int age;// ... Getters and Setters ...
}// Controller 方法
@PostMapping
public ResponseEntity<String> createUser(@Valid @RequestBody User user) {// 如果校驗失敗,Spring 會自動返回 400 Bad Request// 如果校驗成功,代碼繼續執行System.out.println("Received valid user: " + user);// ...return ResponseEntity.status(HttpStatus.CREATED).body("User created successfully: " + user.getUsername());
}

要使 @Valid 生效,需要添加 spring-boot-starter-validation 依賴(如果使用 Spring Boot)或相應的 hibernate-validator 依賴。

總結

  • @RequestBody 用于將 HTTP 請求的完整 Body 反序列化為一個 Java 對象。
  • 主要用于接收 POST, PUT, PATCH 請求中的 JSONXML 數據。
  • 依賴于 HttpMessageConverter 和相應的庫(如 jackson-databind for JSON,jackson-dataformat-xml or JAXB for XML)。
  • spring-boot-starter-web 默認包含 Jackson JSON 支持。處理 XML 需要手動添加依賴。
  • 客戶端必須發送正確的 Content-Type Header。
  • 一個方法只能有一個 @RequestBody 參數。
  • 常與 @Valid 結合進行自動數據校驗。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79589.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79589.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79589.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

海外平臺短劇批量混剪自動剪輯智能去重與多語言適配方案解析

一、引言&#xff1a;全球化內容分發的技術挑戰 在短劇出海的浪潮中&#xff0c;如何通過標準化技術流程實現「高效生產 合規分發」成為行業關鍵課題。本文結合 TikTok、YouTube 等平臺的運營經驗&#xff0c;解析基于智能去重算法、多語言字幕生成、動態元素疊加的全流程解決…

stm32 hal庫 SPI使用(二)硬件SPI的HAL庫函數調用

使用硬件SPI1&#xff0c;開啟DMA&#xff0c;軟件NSS。 1.使用硬件spi后&#xff0c;spi.c文件里會自動生成SPI_HandleTypeDef hspi1句柄&#xff0c;并且在main.c中自動使用MX_SPI1_Init&#xff08;&#xff09;函數對hsp1句柄賦值和SPI初始化 void MX_SPI1_Init(void) {h…

ES類的索引輪換

通過以下請求方法創建一個名為 “tiered-storage-policy” 的 ISM policy&#xff1a; PUT _plugins/_ism/policies/tiered-storage-policy {"policy": {"description": "Changes replica count and deletes.","schema_version": 1,…

51LA使用方法與悟空統計,網站數據分析的雙重選擇

在網站運營與數據分析領域&#xff0c;51LA作為國內較早的流量統計工具&#xff0c;曾為許多用戶提供基礎的訪問數據監測服務。然而&#xff0c;隨著技術的發展和用戶需求的升級&#xff0c;越來越多的企業開始尋求功能更全面、體驗更優的統計工具。小編今天將給大家介紹一款更…

go語言實現用戶管理系統

goweb實現用戶管理系統 用戶后臺管理系統功能描述 登錄功能 支持用戶通過郵箱密碼和密碼進行登錄。對輸入的郵箱和密碼進行驗證&#xff0c;確保用戶信息的正確性。登錄成功后&#xff0c;更新用戶的今日登錄統計信息&#xff0c;并將用戶信息存入會話&#xff08;cookie&am…

Elasticsearch:RAG 和 grounding 的價值

作者&#xff1a;來自 Elastic Toms Mura 了解 RAG、grounding&#xff0c;以及如何通過將 LLM 連接到你的文檔來減少幻覺。 更多閱讀&#xff1a;Elasticsearch&#xff1a;在 Elastic 中玩轉 DeepSeek R1 來實現 RAG 應用 想獲得 Elastic 認證嗎&#xff1f;查看下一期 Elast…

【黑馬JavaWeb+AI知識梳理】后端Web基礎01 - Maven

Maven Maven核心 Maven概述 定義&#xff1a; Maven是一款用于管理和構建Java項目的工具&#xff0c;是apache旗下的一個開源項目&#xff0c;基于項目對象模型&#xff08;POM&#xff0c;project object model&#xff09;的概念&#xff0c;通過一小段描述信息來管理項目的…

C語言易混淆知識點詳解

C語言中容易混淆的知識點詳解 C語言作為一門基礎且強大的編程語言&#xff0c;有許多容易混淆的概念和特性。以下是C語言中一些常見易混淆知識點的詳細解析&#xff1a; 1. 指針與數組 相似點&#xff1a; c 復制 下載 int arr[10]; int *ptr arr; 都可以使用[]運算符訪…

MCP原理詳解及實戰案例(動嘴出UI稿、3D建模)

文章目錄 MCP 原理介紹架構核心組件協議層傳輸層連接生命周期MCP與function calling: 互補關系 MCP python SDKMCP的優點 怎么用MCP&#xff1a;天氣服務參考應用項目&#xff1a; REF 24年11月份&#xff0c;claude推出了模型上下文協議( MCP),作為一種潛在的解決方案&#xf…

2025年深圳杯數學建模(東三省)B題【顏色轉換】原論文講解(含完整python代碼)

大家好呀&#xff0c;從發布賽題一直到現在&#xff0c;總算完成了2025年深圳杯數學建模&#xff08;東三省&#xff09;B題【顏色轉換】完整的成品論文。 本論文可以保證原創&#xff0c;保證高質量。絕不是隨便引用一大堆模型和代碼復制粘貼進來完全沒有應用糊弄人的垃圾半成…

cpp學習筆記1--class

2年前學過cpp&#xff0c;但是一直沒有用到&#xff0c;現在要讀研了&#xff0c;終于要用到了&#xff0c;重新拿出來看一看&#xff0c;覺得很多東西都能在c和python上看到影子。 #include "iostream" class Person { private:std::string name;int age;public://…

基于YOLOv的目標檢測訓練數據構建方法研究—圖像采集、標注、劃分與增強一體化流程設計

在目標檢測任務中,高質量的訓練數據是模型性能提升的關鍵。本文圍繞 YOLOv 系列模型,系統性地研究了目標檢測訓練數據的構建方法,提出了一套從圖像采集、標注、數據集劃分到數據增強的一體化流程設計 。通過多源圖像采集策略確保樣本多樣性,結合 LabelImg 工具完成 VOC 格式…

SQL數據庫操作大全:從基礎到高級查詢技巧

大家好&#xff0c;歡迎來到程序視點&#xff01;我是你們的老朋友.小二&#xff01; SQL數據庫操作核心語法精要 數據庫基礎操作 創建/刪除數據庫&#xff1a;CREATE DATABASE / DROP DATABASE 備份SQL Server&#xff1a;使用sp_addumpdevice和BACKUP DATABASE命令 數據庫…

[2025]MySQL的事務機制是什么樣的?redolog,undolog、binog三種日志的區別?二階段提交是什么?ACID怎么保證的?主從復制的過程?

MySQL事務機制與日志系統詳解 一、MySQL事務機制 1. 事務特性&#xff08;ACID&#xff09; 特性實現機制原子性(Atomicity)undo log回滾,(事務作為一個整體被執行&#xff0c;包含在其中的對數據庫的操作要么全部被執行&#xff0c;要么都不執行)。一致性(Consistency)約束…

LLama-v2 權重下載

地址&#xff1a;llama模型 官方github倉庫&#xff1a;llama倉庫 注意點 網絡代理位置&#xff1a;美國下面的國家選擇 United States 克隆倉庫后 運行bash download.sh輸入郵箱收到的URL選擇要下載的權重等待下載完成即可 有問題留言&#xff01;&#xff01;&#xff01…

zephyr OS架構下構建Nordic MCU boot

目錄 概述 1. 軟硬件環境 1.1 軟件開發環境 1.2 硬件環境 2 MCU boot 2.1 核心功能 2.2 關鍵術語 2.3 重要字段介紹 3 VS-Code下創建MCU-BOOT項目 3.1 軟件框架結構 3.2 創建測試項目 3.3 編譯項目 3.3 固件在Flash中的分布 4 驗證 4.1 燒寫固件 ? 4.2 代碼…

【Mytais系列】介紹、核心概念

MyBatis 是一款優秀的 持久層框架&#xff0c;它通過簡化 JDBC 操作、提供靈活的 SQL 映射能力&#xff0c;成為 Java 開發中處理數據庫交互的核心工具之一。以下是 MyBatis 的核心框架和概念解析&#xff1a; 一、MyBatis 框架概述 1. 核心定位 作用&#xff1a;將 Java 對象…

IO模型和多路復用

一、IO模型的基礎理解 什么是IO? IO全稱是 Input/Output(輸入/輸出),在計算機科學里主要指程序與外部設備(硬盤、網絡、用戶終端等)進行數據交換的操作。首要特點是: IO通常很慢(從CPU和內存的視角看)經常需要等待外部設備響應1. 為什么要談IO模型? 當一個程序需要…

深入理解 Bash 中的 $‘...‘ 字符串語法糖

在 Bash 腳本編程中&#xff0c;字符串處理是不可或缺的一部分。為了讓開發者更高效地處理特殊字符和控制字符&#xff0c;Bash 引入了一種獨特的字符串語法糖&#xff1a;$&#xff08;帶單引號的 ANSI-C 風格字符串&#xff09;。這種語法來源于 C 語言的 ANSI-C 標準&#x…

用Python打造自己的專屬命令行工具

在日常的開發和使用過程中&#xff0c;我們常常會編寫一些實用的Python腳本&#xff0c;比如用來批量處理文件、獲取系統信息等。然而&#xff0c;每次都要輸入python script_name.py來運行腳本&#xff0c;時間一長難免覺得繁瑣。要是能像使用系統自帶的命令&#xff08;如ls、…