Spring 中處理 HTTP 請求參數注解全解析

在 Spring 框架的 Web 開發中,處理 HTTP 請求參數是一項基礎且重要的工作。除了?@PathVariable@RequestParam?和?@Valid @RequestBody?外,還有一些其他注解也用于此目的。本文將對這些注解進行全面的區分和解析,幫助開發者在實際項目中更準確地選擇和使用。

一、@PathVariable

1. 用途與原理

@PathVariable?用于從 URL 路徑中提取變量值。它遵循 RESTful 架構風格,使 URL 能夠直觀地反映資源的標識符。Spring 會將 URL 中對應位置的變量值綁定到方法參數上。

2. 示例

假設我們有一個獲取用戶信息的接口,URL 為?/users/{id},代碼如下:

@GetMapping("/users/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {// 根據id查詢用戶User user = userService.findById(id);return ResponseEntity.ok(user);
}

3. 特點

  • 路徑相關性:緊密依賴 URL 路徑結構,變量值直接嵌入路徑中。
  • 類型轉換:支持自動類型轉換,如將路徑中的字符串轉換為方法參數所需的?LongInteger?等類型。若轉換失敗,會拋出異常。

二、@RequestParam

1. 用途與原理

@RequestParam?主要用于獲取 URL 查詢參數,即???后面的鍵值對。Spring 會從請求的參數列表中找到對應名稱的參數,并將其值綁定到方法參數上。

2. 示例

比如我們有一個搜索用戶的接口,支持根據用戶名和年齡范圍進行篩選,URL 可能為?/users?name=John&minAge=18&maxAge=30,代碼如下:

@GetMapping("/users")
public ResponseEntity<List<User>> searchUsers(@RequestParam(required = false) String name,@RequestParam(required = false, defaultValue = "0") int minAge,@RequestParam(required = false, defaultValue = "120") int maxAge) {List<User> users = userService.search(name, minAge, maxAge);return ResponseEntity.ok(users);
}

3. 特點

  • 靈活性:參數在 URL 中以鍵值對形式呈現,可靈活添加、修改或刪除,適用于傳遞各種可選的過濾、排序或分頁參數。
  • 默認值與必填性:可以通過?required?屬性指定參數是否必填,通過?defaultValue?屬性設置默認值。

三、@Valid @RequestBody

1. 用途與原理

@RequestBody?用于獲取 HTTP 請求體中的數據,通常用于處理 JSON、XML 等格式的數據。@Valid?則用于對綁定后的 Java 對象進行校驗,確保對象的屬性符合預先定義的規則。

2. 示例

假設前端發送一個 JSON 格式的用戶注冊信息,我們的接口如下:

@PostMapping("/register")
public ResponseEntity<String> registerUser(@Valid @RequestBody UserRegistrationDto userDto) {userService.register(userDto);return ResponseEntity.ok("注冊成功");
}

其中?UserRegistrationDto?類可能包含一些校驗注解,如:

public class UserRegistrationDto {@NotNull(message = "用戶名不能為空")private String username;@NotNull(message = "密碼不能為空")@Size(min = 6, message = "密碼長度至少為6位")private String password;// 省略getter和setter方法
}

3. 特點

  • 處理復雜對象:非常適合處理包含多個屬性的復雜對象,通過反序列化將請求體數據映射到 Java 對象。
  • 數據校驗:結合?@Valid?以及各種校驗注解,可在方法執行前對數據進行嚴格校驗,提高數據的準確性和安全性。

四、@RequestHeader

1. 用途與原理

@RequestHeader?用于獲取 HTTP 請求頭中的信息。Spring 會從請求頭中找到指定名稱的頭信息,并將其值綁定到方法參數上。

2. 示例

獲取請求頭中的?User - Agent,代碼如下:

@GetMapping("/info")
public ResponseEntity<String> getInfo(@RequestHeader("User - Agent") String userAgent) {return ResponseEntity.ok("您的瀏覽器信息: " + userAgent);
}

3. 特點

  • 獲取元數據:常用于獲取與請求相關的元數據,如客戶端類型、語言偏好、認證令牌等,這些信息對服務器處理請求有重要參考價值。
  • 類型轉換:與?@RequestParam?類似,支持基本類型和?String?類型的自動轉換。

五、@CookieValue

1. 用途與原理

@CookieValue?用于獲取 HTTP 請求中的 Cookie 值。Spring 會從請求的 Cookie 中找到指定名稱的 Cookie,并將其值綁定到方法參數上。

2. 示例

獲取名為?JSESSIONID?的 Cookie 值,代碼如下:

@GetMapping("/session")
public ResponseEntity<String> getSessionInfo(@CookieValue("JSESSIONID") String sessionId) {return ResponseEntity.ok("您的會話ID: " + sessionId);
}

3. 特點

  • 會話跟蹤:在基于 Cookie 的會話管理中非常有用,可獲取用戶會話相關信息,用于身份驗證、個性化設置等。
  • 可選性與默認值:與?@RequestParam?類似,可通過?required?和?defaultValue?屬性控制 Cookie 是否必填以及設置默認值。

六、總結

不同的請求參數處理注解在 Spring Web 開發中各有其獨特的用途和特點。在實際項目中,應根據請求數據的來源、格式和業務需求,合理選擇使用這些注解,以實現高效、準確的請求處理邏輯。

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

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

相關文章

【代碼隨想錄算法訓練營——Day11】棧與隊列——150.逆波蘭表達式求值、239.滑動窗口最大值、347.前K個高頻元素

LeetCode題目鏈接 https://leetcode.cn/problems/evaluate-reverse-polish-notation/ https://leetcode.cn/problems/sliding-window-maximum/ https://leetcode.cn/problems/top-k-frequent-elements/ 題解 150.逆波蘭表達式求值、 不能用tokens[i] > "0" &&…

Docker 容器化部署核心實戰——鏡像倉庫管理與容器多參數運行詳解

摘要&#xff1a; 在當今云原生技術迅速發展的背景下&#xff0c;Docker 已成為應用容器化的首選工具。本文作為“Docker 容器化部署核心實戰&#xff1a;從鏡像倉庫管理、容器多參數運行到 Nginx 服務配置與正反向代理原理解析”系列的第一篇&#xff0c;將深入探討 Docker 鏡…

ESP8266無法連接Jio路由器分析

我查了一下關于這些 Jio 路由器型號&#xff08;尤其是 JCOW414 和 JIDU6801&#xff09;的公開資料&#xff0c;下面是我能拿到的內容 對比這些型號可能帶來的問題&#xff0c;以及對你排障的補充建議。 路由器型號 & 公開已知特性 型號已知 / 可查特性和 ESP8266 的潛在…

傳智播客--MySQL

DAY01 MySQL入門 第一章 數據庫介紹 1.1 什么是數據庫 數據存儲的倉庫&#xff0c;本質上是一個文件系統&#xff0c;作用&#xff1a;方便管理數據的。 1.2 數據庫管理系統 數據庫管理系統&#xff08;DataBase Management System, DBMS&#xff09;&#xff1a;指一種操作和管…

[Dify] 實現“多知識庫切換”功能的最佳實踐

在構建知識驅動的問答系統或 AI 助手時,一個常見需求是:根據用戶問題所屬領域或上下文,切換使用不同的知識庫(Knowledge Base, KB)進行檢索。這樣可以提升回答的準確性、減少無關內容干擾,在多業務線或多主題應用中尤其有用。 本文將介紹: 為什么要做知識庫切換 Dify …

Jenkins運維之路(Jenkins流水線改造Day02-2-容器項目)

上篇文章中已經將絕大部分&#xff0c;Jenkins容器項目打包的相關功能改造完成了&#xff0c;這里在對構建部署后的告警類操作進行一些補充1.流水線告警1.1 安裝釘釘插件image-202509151111086851.2 配置釘釘插件image-20250915111235865image-202509151115328291.3 Pipeline釘…

64_基于深度學習的蝴蝶種類檢測識別系統(yolo11、yolov8、yolov5+UI界面+Python項目源碼+模型+標注好的數據集)

目錄 項目介紹&#x1f3af; 功能展示&#x1f31f; 一、環境安裝&#x1f386; 環境配置說明&#x1f4d8; 安裝指南說明&#x1f3a5; 環境安裝教學視頻 &#x1f31f; 二、數據集介紹&#x1f31f; 三、系統環境&#xff08;框架/依賴庫&#xff09;說明&#x1f9f1; 系統環…

N1ctf-2025-PWN-ez_heap近隊容器的禮儀

ez_heap 保護全開 程序邏輯&#xff1a; 讀入0x30的字符串&#xff0c;進行字符串校驗&#xff1a;以冒號為標志split&#xff0c;分成四份。最后輸入字符串形如&#xff1a; xor 0x111111111111111 validate badmin:p64(xor)b:Junior:111111創建0x180的chunk存放note 結構體…

縱深防御實踐:東方隱俠CI/CD安全體系構建全解析

前言:CI/CD安全的必要性 企業上云是近些年的潮流,但是風險如影隨形。之前有家電商平臺出了個大岔子——半夜自動發新版本的時候,因為流程里沒做安全檢查,直接導致系統故障,一天就損失了300多萬。這還不算完,某銀行測試人員通過未授權的自動發布流程把代碼推到了生產環境…

2025年滲透測試面試題總結-71(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 2. 滲透測試流程 & 內網滲透經驗 3. SQL注入報錯利用 4. XSS利用&#xff08;反射型/DOM型&#xff0…

基于Echarts+HTML5可視化數據大屏展示-茶園大數據平臺指揮艙

效果展示&#xff1a;代碼結構&#xff1a;主要代碼實現 index.html布局 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&quo…

華為網路設備學習-33(BGP協議 八)BGP路由 選路規則

一、目標與背景BGP路由特性&#xff1a;支持豐富的路徑屬性選路規則多樣注&#xff1a;在BGP路由表中最優選&#xff0c;不一定是路由表中的最優選。有可能存在靜態路由或者ospf路由等&#xff0c;其優先級高于BGP路由。二、選路規則概述從1到12&#xff0c;依次對比優先級。一…

深度學習(七):梯度下降

梯度下降&#xff08;Gradient Descent&#xff09;是深度學習中最核心的優化方法之一&#xff0c;它通過迭代更新模型參數&#xff0c;使得損失函數達到最小值&#xff0c;從而訓練出性能良好的神經網絡模型。 基礎原理 損失函數 在深度學習中&#xff0c;損失函數 L(θ) 是衡…

常見巖性分類與油氣勘探意義筆記

常見巖性分類與油氣勘探意義筆記 相關科普視頻可查看【說說巖石的分類-嗶哩嗶哩】 一、巖石基本分類體系 根據成因&#xff0c;自然界巖石可分為三大類&#xff0c;其中沉積巖與油氣勘探關系最為密切&#xff1a; 1. 火成巖&#xff08;巖漿巖&#xff09; 由巖漿冷卻凝固…

【Kubernetes】Tomcat 啟用 Prometheus 監控指標

之前出過一篇文章關于 “自定義監控指標實現業務 HPA 伸縮” &#xff0c;其中使用了 webapp 應用的指標數據&#xff08;JVM&#xff09;&#xff0c;接下來&#xff0c;這篇文章將介紹如何在通過 Tomcat 部署的 webapp 中啟用 Metrics 指標&#xff0c;一起來看看吧&#xf…

JVM 三色標記算法詳解!

目錄1. 什么是三色標記算法&#xff1f;三種顏色及其含義&#xff1a;2. 基礎三色標記算法流程 (非并發)3. 并發場景下的挑戰&#xff1a;一致性問題3.1. 漏標 (Missing Live Object) - 最嚴重的問題3.2. 錯標 (Floating Garbage) - 不那么嚴重的問題4. 屏障機制 (Barrier) - 解…

優化神經網絡模型以提升R2值至0.99的全面方案

優化神經網絡模型以提升R值至0.99的全面方案 1. 問題分析與背景 在深度學習項目中&#xff0c;提升模型的R&#xff08;決定系數&#xff09;值至0.99是一個具有挑戰性的目標&#xff0c;特別是在處理復雜的時間序列數據時。我們的現有模型結合了LSTM層、自注意力機制和MLP處理…

pgNow:一款免費的PostgreSQL監控與性能診斷工具

pgNow 是一款免費的桌面工具&#xff0c;可以為 PostgreSQL 數據庫提供快速集中的監控與性能診斷。 pgNow 不依賴代理&#xff0c;無需任何配置&#xff0c;可以幫助開發者或數據庫管理員&#xff08;DBA&#xff09;直觀地查看數據庫的統計信息和關鍵性能指標。 功能特性 跨平…

深入理解棧與隊列——從原理理解到實戰應用

目錄 一、引言 二、棧&#xff08;Stack&#xff09; 2.1 棧的基本概念 2.2 棧的使用 2.3 棧的模擬實現 2.4 棧的實戰應用 2.4.1 括號匹配 2.4.2 逆波蘭表達式求值 2.4.3 出棧入棧次序匹配 2.4.4 最小棧 三、隊列&#xff08;Queue&#xff09; 3.1 隊列的基本概念 …

用html5寫王者榮耀之王者墳墓的游戲2deepseek版

我將為您創建一個王者榮耀英雄墳墓游戲的提詞器HTML頁面。這個工具將幫助游戲主播或玩家在游戲中快速查看英雄技能、連招順序等信息。設計思路 創建英雄選擇界面實現提詞器顯示區域&#xff0c;可自定義文本內容添加字體大小、滾動速度控制設計符合王者榮耀風格的UI下面是…