Spring Boot 參數校驗全指南

Spring Boot 參數校驗全指南

在 Web 開發中,參數校驗是保障接口安全性和數據合法性的關鍵環節。手動編寫校驗邏輯不僅繁瑣,還容易遺漏邊界情況。Spring Boot 整合了 validation 工具,提供了一套簡潔高效的參數校驗方案,可快速實現對簡單數據類型、對象類型的校驗,并支持自定義異常處理。

一、參數校驗入門:簡單數據類型校驗

1. 引入依賴

Spring Boot 提供了 spring-boot-starter-validation 起步依賴,內置了參數校驗所需的核心組件:

<!-- 參數校驗依賴 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2. 開啟參數校驗

在控制器類上添加 @Validated 注解,開啟參數校驗功能:

@Validated // 開啟參數校驗
@Controller
public class TestController {// 接口方法...
}

3. 常用校驗注解

對簡單數據類型(如字符串、數字)的校驗,可直接在方法參數上添加校驗注解。常用注解如下:

注解作用示例
@NotBlank字符串不為 null 且去除空格后不為空串@NotBlank String username
@NotNull對象不為 null(適用于包裝類)@NotNull Integer age
@NotEmpty集合不為 null 且不為空@NotEmpty List<String> ids
@Min數字最小值@Min(0) Integer score
@Max數字最大值@Max(150) Integer age
@Email字符串符合郵箱格式@Email String email
@Length字符串長度在指定范圍內@Length(min=2, max=10) String name

4. 簡單類型校驗示例

@Validated
@Controller
public class TestController {@RequestMapping("/user")@ResponseBodypublic String addUser(@NotBlank(message = "用戶名不能為空") String username, // 非空校驗@NotNull(message = "年齡不能為空") @Min(0) @Max(150) Integer age, // 非空+范圍校驗@Email(message = "郵箱格式不正確") String email // 格式校驗) {return "參數校驗通過:" + username + ", " + age + ", " + email;}
}
  • message 屬性用于自定義校驗失敗時的提示信息。
  • 當參數不符合校驗規則時,會拋出 ConstraintViolationException 異常。

二、異常處理:統一響應錯誤信息

參數校驗失敗后,Spring Boot 會默認拋出異常并返回 400 錯誤,但默認的錯誤信息不夠友好。我們可以通過以下兩種方式統一處理校驗異常:

1. 自定義錯誤頁面(適用于前后端不分離)

Spring Boot 會自動跳轉至 src/main/resources/templates/error.html 頁面,可在該頁面展示友好的錯誤提示:

<!-- error.html -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>錯誤提示</title>
</head>
<body><h1>參數錯誤</h1><p>請檢查輸入的參數是否符合要求</p>
</body>
</html>

2. 全局異常處理器(適用于前后端分離)

通過 @ControllerAdvice 定義全局異常處理器,捕獲校驗異常并返回 JSON 格式的錯誤信息:

@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {// 處理簡單類型參數校驗異常@ExceptionHandler(ConstraintViolationException.class)public Map<String, String> handleConstraintViolationException(ConstraintViolationException e) {Map<String, String> errorMap = new HashMap<>();// 獲取所有校驗失敗的信息e.getConstraintViolations().forEach(violation -> {String field = violation.getPropertyPath().toString(); // 參數名String message = violation.getMessage(); // 錯誤信息errorMap.put(field, message);});return errorMap;}
}

當參數校驗失敗時,會返回類似以下的 JSON 響應:

{"username": "用戶名不能為空","email": "郵箱格式不正確"
}

三、對象類型參數校驗

對于復雜業務場景,接口通常接收對象類型的參數(如用戶注冊信息、訂單信息)。此時需對對象的每個屬性進行校驗,步驟如下:

1. 定義實體類并添加校驗注解

在實體類的字段上添加校驗注解,指定校驗規則和錯誤提示:

public class User {@NotNull(message = "ID不能為空")private Integer id;@NotBlank(message = "姓名不能為空")@Length(min = 2, max = 10, message = "姓名長度必須在2-10之間")private String name;@NotNull(message = "年齡不能為空")@Min(value = 0, message = "年齡不能為負數")@Max(value = 150, message = "年齡不能超過150")private Integer age;// getter + setter(必須存在,否則校驗不生效)
}

2. 在控制器中校驗對象

在控制器方法的對象參數前添加 @Validated 注解,并通過 BindingResult 捕獲校驗結果:

@Controller
public class UserController {@RequestMapping("/addUser")@ResponseBodypublic String addUser(@Validated User user, // 開啟對象校驗BindingResult result // 用于接收校驗結果) {// 判斷是否有校驗失敗if (result.hasErrors()) {// 收集所有錯誤信息StringBuilder errorMsg = new StringBuilder();result.getAllErrors().forEach(error -> {FieldError fieldError = (FieldError) error;errorMsg.append(fieldError.getField()).append(":").append(fieldError.getDefaultMessage()).append("; ");});return "參數錯誤:" + errorMsg.toString();}// 校驗通過,處理業務邏輯return "用戶添加成功:" + user.getName();}
}
  • @Validated 用于開啟對象的屬性校驗。
  • BindingResult 必須緊跟在被校驗對象之后,用于接收校驗結果,避免異常直接拋出。

四、常見問題與最佳實踐

1. 校驗注解不生效?

  • 確保已添加 spring-boot-starter-validation 依賴。
  • 控制器類上是否添加 @Validated 注解(簡單類型校驗必需)。
  • 對象類型校驗時,是否在參數前添加 @Validated 注解,且實體類有 getter/setter 方法。

2. 如何自定義校驗規則?

除了內置注解,還可通過 @Pattern 注解自定義正則校驗,例如校驗手機號:

@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手機號格式不正確")
private String phone;

3. 全局異常處理器的優勢

使用 @ControllerAdvice 定義全局異常處理器,可統一處理所有校驗異常,避免在每個接口中重復編寫錯誤處理邏輯,提高代碼復用性。

總結

Spring Boot 的參數校驗機制通過注解化的方式,極大簡化了數據合法性校驗的實現。本文介紹了簡單類型、對象類型的校驗方法,以及異常處理方案,涵蓋了從基礎到實戰的核心場景。合理使用參數校驗,不僅能減少手動校驗代碼,還能提高接口的健壯性和安全性。

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

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

相關文章

常用技術資料鏈接

1.team技術 https://zhuanlan.zhihu.com/p/11389323664 https://blog.csdn.net/Lucky_Lu0/article/details/121697151 2.bond切換主備 https://www.xgss.net/3306.html 3.ssh詳解&#xff1a; https://cloud.tencent.com/developer/news/105165 https://blog.huochengrm.c…

【Spring Cloud】-- 注冊中心

文章目錄1. 什么是注冊中心2. CPA理論1. 什么是注冊中心 注冊中心有三種角色&#xff1a; 服務提供者&#xff08;Server&#xff09; &#xff1a;提供接口給其他微服務的程序。服務消費者&#xff08;Client&#xff09;&#xff1a;調用其他微服務提供的接口。**服務注冊中…

go-zero 詳解

go-zero 詳解 go-zero 是一個基于 Go 語言的微服務框架&#xff0c;由字節跳動團隊開發并開源&#xff0c;旨在幫助開發者快速構建高可用、高性能的微服務架構。它集成了豐富的組件&#xff0c;簡化了微服務開發中的常見問題&#xff08;如服務注冊發現、配置管理、限流熔斷等&…

接口自動化框架封裝之統一請求封裝及通過文件實現接口關聯

接口自動化測試框架封裝目的:簡化自動化框架的落地,提高投入和產出比,只要一個人封裝好框架,另外的測試通過寫yaml測試用例即可實現接口自動化1.統一請求的封裝去除多余重復的代碼可跨py文件實現通過一個session來自動關聯有cookie的接口設置統一公共參數,統一文件處理,統一異常…

Vue 最佳實踐:如何利用唯一 key 值保證 el-table 動態渲染的穩定性

&#x1f4cb; 問題描述 在Vue 2.0 ElementUI項目的偏置條件管理頁面中&#xff0c;每次切換到"內規拉偏"菜單時&#xff0c;表格樣式會發生崩潰&#xff0c;導致表格布局異常、列寬錯亂、固定列顯示不正確等問題。 &#x1f50d; 問題分析 通過深入分析代碼&#x…

popen開啟進程,寫入數據

通過管道&#xff08;popen&#xff09;啟動 SDIWAN_WEB 進程并寫入 JSON 數據的過程可以分為以下步驟&#xff0c;結合代碼示例和關鍵注意事項進行說明&#xff1a;1. 核心代碼示例 #include <stdio.h> #include <json-c/json.h>int main() {// 1. 創建 JSON 對象…

計算機視覺的四項基本任務辨析

計算機視覺是使計算機能理解采集設備采集的圖像視頻的一門學科&#xff0c;目的是讓計算機實現人的視覺功能——對客觀世界的三維場景的感知、識別和理解。換句話說&#xff0c;要讓計算機具備通過二維圖像認識三維環境的能力。 目錄 三個階段 視覺層級 基本任務 技術難點…

iostat 系統IO監控命令學習

一、iostat 命令描述 “iostat”命令用于監測系統輸入/輸出設備的負載情況&#xff0c;其通過觀察設備處于活躍狀態的時間與平均傳輸速率之間的關系來實現這一目的。該命令會生成報告&#xff0c;這些報告可用于調整系統配置&#xff0c;以更好地平衡物理磁盤之間的輸入/輸出負…

jenkins使用ssh方式連接gitee 公鑰、私鑰配置、指紋

前言 Gitee 提供了基于 SSH 協議的 Git 服務&#xff0c;jenkins可使用ssh方式連接gitee&#xff0c;拉取代碼、提交tag等&#xff1b;使用ssh 連接&#xff0c;相比用戶名密碼方式&#xff0c;可省去因密碼變更而引起的jenkins關聯修改。 gitee生成、添加 SSH 公鑰 生成SSH…

如何在Android設備上刪除多個聯系人(3種方法)

如果您想清理安卓手機&#xff0c;或者只是想刪除舊的、不需要的聯系人&#xff0c;或者刪除多個聯系人&#xff0c;有三種有效的方法可供選擇。無論您是想手動刪除安卓手機上的聯系人&#xff0c;還是使用專用工具&#xff0c;都可以按照以下步驟操作。方法1&#xff1a;如何通…

Angular進階之十三:Angular全新控制流:革命性的模板語法升級

隨著Angular v17的發布&#xff0c;框架帶來了革命性的控制流語法&#xff0c;徹底改變了我們編寫模板的方式。這些改進不僅僅是語法糖——它們提升了性能、開發體驗和代碼可維護性。 為什么我們需要新的控制流&#xff1f; 在之前的Angular版本中&#xff0c;我們使用結構指令…

【Redis】string字符串

目錄 一.常見命令 1.1.SET 1.2.GET 1.3.MGET 1.4.MSET 1.5.SETNX 二.計數命令 2.1.INCR 2.2.INCRBY 2.3.DECR 2.4.DECYBY 2.5.INCRBYFLOAT 三 . 其他命令 3.1.APPEND 3.2.GETRANGE 3.3.SETRANGE 3.4.STRLEN 四. 字符串類型內部編碼 五. 典型使用場…

Nginx 學習

通過網盤分享的文件&#xff1a;Nginx 鏈接: https://pan.baidu.com/s/1dCc7FoND90H_x7rvRUXJqg 提取碼: yyds 通過網盤分享的文件&#xff1a;Tomcat 鏈接: https://pan.baidu.com/s/1nj_5j_66gS_YHUAX1C25jg 提取碼: yyds Nginx安裝、啟動 安裝依賴庫 #安裝C編譯器 yum insta…

Java、Android及計算機基礎面試題總結

1. String、StringBuffer、StringBuilder區別特性StringStringBufferStringBuilder可變性不可變可變可變線程安全是是(synchronized)否性能低(頻繁操作時)中等高場景字符串常量多線程字符串操作單線程字符串操作2. 接口和抽象類的區別特性接口(Interface)抽象類(Abstract Class…

數據集相關類代碼回顧理解 | sns.distplot\%matplotlib inline\sns.scatterplot

【PyTorch】單目標檢測項目 目錄 os.path.join sns.distplot adjust_brightness os.path.join fullPath2imgos.path.join(path2data,"Training400",prefix,imgName[id_]) 使用os.path.join函數&#xff0c;智能地處理不同操作系統中的路徑分隔符問題&#xff0…

JavaScript:鏈式調用

概念 鏈式調用&#xff08;Method Chaining&#xff09;是 JavaScript 中一種常見的編程模式&#xff0c;允許通過連續調用對象的方法來簡化代碼。這種模式的核心在于每個方法返回調用對象本身&#xff08;通常是 this&#xff09;&#xff0c;從而可以繼續調用其他方法。 鏈式…

龍芯(loongson) ls2k1000 openwrt

PC環境&#xff1a;Linux Mint 21.3安裝依賴sudo apt install build-essential clang flex bison g gawk gcc-multilib g-multilib gettext git libncurses-dev libssl-dev python3-distutils rsync unzip zlib1g-dev file wget下載源碼&#xff1a;git clone https://gitee.co…

算法438. 找到字符串中所有字母異位詞

給定兩個字符串 s 和 p&#xff0c;找到 s 中所有 p 的 異位詞 的子串&#xff0c;返回這些子串的起始索引。不考慮答案輸出的順序。示例 1:輸入: s "cbaebabacd", p "abc" 輸出: [0,6] 解釋: 起始索引等于 0 的子串是 "cba", 它是 "abc&…

Go語言中的閉包詳解

閉包在Go語言中是一個能夠訪問并操作其外部作用域變量的函數&#xff0c;即使外部函數已經執行完畢。閉包由函數體和其引用的環境&#xff08;外部變量&#xff09;組成&#xff0c;及&#xff1a;閉包 函數 環境。閉包的特性&#xff1a;捕獲外部變量&#xff1a;內部函數可…

【DL學習筆記】Dataset類功能以及自定義

文章目錄一、Dataset 與 DataLoader 功能介紹抽象類Dataset的作用DataLoader 作用兩者關系二、自定義Dataset類Dataset的三個重要方法__len__()方法_getitem__()方法__init__ 方法三、現成的torchvision.datasets模塊MNIST舉例COCODetection舉例torchvision.datasets.MNIST使用…