Spring Boot - 參數校驗:分組校驗、自定義注解、嵌套對象全解析

在這里插入圖片描述

01 依賴配置

在構建高效的校驗體系前,需先完善項目依賴配置。

以下是優化后的依賴示例:

<dependencies><!-- Web 依賴,提供 RESTful 接口支持 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 校驗核心依賴,整合 Hibernate Validator 實現 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>
</dependencies>

注解:

  1. spring-boot-starter-web 依賴引入了 Spring MVC 組件,為構建 Web 應用提供基礎支持
  2. spring-boot-starter-validation 依賴整合了 Hibernate Validator 實現,提供 JSR 380 校驗規范支持

02 校驗注解體系構建

構建完善的校驗注解體系是實現數據校驗的基礎。

以下是企業級校驗注解應用示例:

import javax.validation.constraints.*;
import java.time.LocalDate;public class UserRegistrationRequest {// 用戶名校驗:非空且長度在 4-20 位之間@NotBlank(message = "用戶名不能為空")@Size(min = 4, max = 20, message = "用戶名長度需在 4-20 位之間")private String username;// 郵箱校驗:非空且符合郵箱格式@NotBlank(message = "郵箱不能為空")@Email(message = "郵箱格式不正確")private String email;// 密碼校驗:非空且長度不少于 8 位@NotBlank(message = "密碼不能為空")@Size(min = 8, message = "密碼長度至少為 8 位")private String password;// 年齡校驗:必須大于 0 且小于 150@Min(value = 1, message = "年齡必須大于 0")@Max(value = 150, message = "年齡不能超過 150")private Integer age;// 出生日期校驗:不能晚于當前日期@PastOrPresent(message = "出生日期不能晚于當前日期")private LocalDate birthDate;// 協議同意校驗:必須為 true@NotNull(message = "必須同意服務條款")private Boolean termsAccepted;
}

注解:

  1. 使用組合注解實現多維度校驗,如 @NotBlank + @Size 實現既校驗非空又校驗長度的雙重校驗
  2. 通過明確的錯誤提示信息,提升系統友好性,便于用戶定位問題
  3. 日期類型使用 @PastOrPresent 校驗,避免接收未來日期的非法輸入

03 控制器校驗集成

在控制器層面集成校驗邏輯,確保所有入參經過嚴格校驗:

import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;import javax.validation.Valid;@Validated // 啟用方法參數校驗
@RestController
@RequestMapping("/api/users")
public class UserController {@PostMapping("/register")public ResponseEntity registerUser(@Valid @RequestBody UserRegistrationRequest request) {// 業務邏輯處理return ResponseEntity.ok("用戶注冊成功");}@GetMapping("/{id}")public ResponseEntity getUserById(@PathVariable Long id) {// 用戶查詢邏輯return ResponseEntity.ok(new User(id, "示例用戶"));}
}

注解:

  1. @Validated 注解啟用控制器方法參數校驗,配合 @Valid 對請求體進行深度校驗

  2. @RequestBody 結合校驗注解,實現復雜對象的自動綁定與校驗

  3. 通過明確的 HTTP 狀態碼和響應消息,提供標準化的接口反饋

04 全局異常處理機制

構建完善的全局異常處理機制,統一管理校驗異常:

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import java.util.HashMap;
import java.util.Map;@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(MethodArgumentNotValidException.class)public ResponseEntity handleValidationExceptions(MethodArgumentNotValidException ex) {Map<String, String> errors = new HashMap<>();ex.getBindingResult().getFieldErrors().forEach(error -> {errors.put(error.getField(), error.getDefaultMessage());});return ResponseEntity.badRequest().body(errors);}@ExceptionHandler(Exception.class)public ResponseEntity handleGeneralException(Exception ex) {return ResponseEntity.internalServerError().body("系統內部錯誤");}
}

注解:

  1. 通過 @RestControllerAdvice 實現全局異常處理,集中管理各類異常
  2. 針對校驗異常提取字段級錯誤信息,返回結構化的錯誤響應
  3. 提供默認異常處理方法,確保所有未被捕獲的異常都能得到妥善處理

05 分組校驗實現

在復雜業務場景中,通過分組校驗實現條件校驗邏輯:

// 定義校驗分組接口
public interface CreateGroup {}
public interface UpdateGroup {}// 應用分組校驗的 DTO 類
public class UserDTO {@NotBlank(groups = CreateGroup.class, message = "創建時用戶名必填")@Size(groups = CreateGroup.class, min = 4, message = "用戶名長度至少為 4")private String username;@Email(groups = {CreateGroup.class, UpdateGroup.class}, message = "郵箱格式不正確")private String email;// Getter 和 Setter 方法
}
// 控制器方法應用分組校驗
@PostMapping("/users")
public ResponseEntity createUser(@Validated({CreateGroup.class}) UserDTO userDTO) {// 創建用戶邏輯return ResponseEntity.ok("用戶創建成功");
}@PutMapping("/users/{id}")
public ResponseEntity updateUser(@Validated({UpdateGroup.class}) UserDTO userDTO) {// 更新用戶邏輯return ResponseEntity.ok("用戶更新成功");
}

注解:

  1. 通過定義接口實現校驗分組,靈活控制不同場景下的校驗規則

  2. 在 DTO 類中指定各字段所屬的校驗分組,實現條件校驗

  3. 控制器方法通過指定校驗分組,精確控制校驗邏輯的觸發場景

06 嵌套對象校驗

處理復雜對象嵌套場景下的校驗需求:

// 嵌套對象校驗示例
public class Order {@NotBlank(message = "訂單號不能為空")private String orderId;@DecimalMin(value = "0.01", message = "訂單金額必須大于 0.01")private BigDecimal amount;// 嵌套 Customer 對象,啟用深度校驗@Validprivate Customer customer;
}public class Customer {@NotBlank(message = "客戶名稱不能為空")private String name;@Email(message = "郵箱格式不正確")private String email;// 嵌套 Address 對象,繼續深度校驗@Validprivate Address address;
}public class Address {@NotBlank(message = "地址不能為空")private String street;@NotBlank(message = "城市不能為空")private String city;
}
// 控制器方法應用嵌套校驗
@PostMapping("/orders")
public ResponseEntity createOrder(@Valid @RequestBody Order order) {// 訂單創建邏輯return ResponseEntity.ok("訂單創建成功");
}

注解:

  1. 使用 @Valid 注解啟用嵌套對象的深度校驗,支持多層對象嵌套
  2. 校驗規則沿用對象關系,自動繼承父對象的校驗上下文
  3. 全局異常處理器自動捕獲嵌套校驗錯誤,返回詳細的錯誤路徑信息

07 自定義校驗注解開發

針對特殊業務場景開發自定義校驗注解:

// 自定義注解定義
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PhoneValidator.class)
public @interface ValidPhoneNumber {String message() default "手機號格式不正確";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}// 自定義校驗實現
public class PhoneValidator implements ConstraintValidator<ValidPhoneNumber, String> {private static final String PHONE_REGEX = "^1[3-9]\\d{9}$";@Overridepublic void initialize(ValidPhoneNumber constraintAnnotation) {// 初始化邏輯}@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {if (value == null || value.trim().isEmpty()) {return true; // 空值不校驗}return Pattern.matches(PHONE_REGEX, value);}
}
// 自定義注解應用示例
public class ContactInfo {@ValidPhoneNumberprivate String phone;// Getter 和 Setter 方法
}

注解:

  1. 通過 @Constraint 注解指定校驗器實現類,完成自定義校驗注解開發
  2. 校驗器實現類需繼承 ConstraintValidator,重寫 isValid 方法定義校驗邏輯
  3. 自定義注解可應用于字段或參數,與內置注解使用方式一致

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

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

相關文章

深入淺出多模態》(十一)之多模態經典模型:Flamingo系列

&#x1f389;AI學習星球推薦&#xff1a; GoAI的學習社區 知識星球是一個致力于提供《機器學習 | 深度學習 | CV | NLP | 大模型 | 多模態 | AIGC 》各個最新AI方向綜述、論文等成體系的學習資料&#xff0c;配有全面而有深度的專欄內容&#xff0c;包括不限于 前沿論文解讀、…

基于Pandas和FineBI的昆明職位數據分析與可視化實現(三)- 職位數據統計分析

文章目錄 一、職位數據分析1. 一級分類職位數量統計分析2. 職位二級分類分布分析3. 職位分布分析4. 工作經驗需求分布分析5. 學歷要求職位分布分析6. 企業職位供給前507. 不同規模公司的職位數量統計8. 區域職位分布分析9. 各區域平均薪資范圍分布分析10. 不同工作經驗平均薪資…

大數據Hadoop之——安裝部署hadoop

目錄 前期準備 一、JDK的安裝 1、安裝jdk 2、配置Java環境變量 3、加載環境變量 4、進行校驗 二、hadoop的環境搭建 1、hadoop的下載安裝 2、配置文件設置 2.1. 配置 hadoop-env.sh 2.2. 配置 core-site.xml 2.3. 配置 hdfs-site.xml 2.4. 配置 yarn-site.xml 2.…

Spring IoC DI介紹

文章目錄 IoC & DI 介紹IoC介紹DI 介紹 組件注冊Bean 命名約定方法注解 Bean總結 掃描路徑DI 詳解屬性注入構造方法注入Setter 注入三種注入優缺點分析 當同一類型存在多個Bean時,直接使用Autowired會存在問題使用Primary注解使用Qualifier注解使用Bean的名稱使用Resource注…

【Flutter】解決 flutter_inappwebview在 Windows 上使用導致應用閃退問題

問題背景 在 Windows 11 上運行 Flutter 桌面應用時&#xff0c;應用出現閃退現象。通過系統事件日志分析&#xff0c;發現是 MSVCP140.dll 模塊的訪問沖突異常&#xff08;錯誤代碼 c0000005&#xff09;導致的崩潰。 問題分析 1. 錯誤現象 應用啟動后立即閃退Windows 事件…

使用 JavaScript、Mastra 和 Elasticsearch 構建一個具備代理能力的 RAG 助手

作者&#xff1a;來自 Elastic JD Armada 了解如何在 JavaScript 生態系統中構建 AI 代理。 Elasticsearch 與業界領先的生成式 AI 工具和服務商有原生集成。查看我們的網絡研討會&#xff0c;了解如何超越 RAG 基礎&#xff0c;或使用 Elastic 向量數據庫構建可投入生產的應用…

Active Directory 環境下 Linux Samba 文件共享服務建設方案

Active Directory 環境下 Linux Samba 文件共享服務建設方案 目錄 需求分析方案總體設計技術架構與選型詳細部署規劃共享文件性能測試非域終端共享配置運維與權限安全管理建議1. 需求分析 因某公司(編的)新增多個部門,各部門之間存在多類型終端系統,但又有同時訪問文件庫…

Python爬蟲網安-項目-簡單網站爬取

源碼&#xff1a; https://github.com/Wist-fully/Attack/tree/pc pc_p1 目標&#xff1a; 1.進入列表頁&#xff0c;順著列表爬取每個電影詳情頁 2.利用正則來提取&#xff0c;海報&#xff0c;名稱&#xff0c;類別&#xff0c;上映的時間&#xff0c;評分&#xff0c;劇…

Golang中的數組

Golang Array和以往認知的數組有很大不同。有點像Python中的列表 1. 數組&#xff1a;是同一種數據類型的固定長度的序列。 2. 數組定義&#xff1a;var a [len]int&#xff0c;比如&#xff1a;var a [5]int&#xff0c;數組長度必須是常量&#xff0c;且是類型的組成部分。一…

《Origin畫百圖》之矩陣散點圖

矩陣散點圖的作用 一、直觀展示多變量間的兩兩關系 矩陣散點圖的基本單元是兩兩變量的散點圖&#xff0c;每個散點圖對應矩陣中的一個單元格&#xff0c;可直接反映變量間的&#xff1a; 相關性方向&#xff1a;正相關&#xff08;散點向右上傾斜&#xff09;或負相關&#x…

Flask文件下載send_file中文文件名處理解決方案

Flask文件下載send_file中文文件名處理解決方案 Flask文件下載中文文件名處理解決方案問題背景問題分析核心問題常見癥狀 解決方案技術實現關鍵技術點 完整實現示例 Flask文件下載中文文件名處理解決方案 問題背景 在Web應用開發中&#xff0c;當用戶下載包含中文字符的文件時…

新手指南:在 Ubuntu 上安裝 PostgreSQL 并通過 VS Code 連接及操作

本文檔記錄了一個初學者在 Ubuntu 系統上安裝、配置 PostgreSQL 數據庫&#xff0c;并使用 Visual Studio Code (VS Code) 作為客戶端進行連接和操作的全過程。其中包含了遇到的常見錯誤、分析和最終的解決方案&#xff0c;旨在為新手提供一個清晰、可復現的操作路徑。 最終目…

二刷 蒼穹外賣day10(含bug修改)

Spring Task Spring框架提供的任務調度工具&#xff0c;可以按照約定的時間自動執行某個代碼邏輯 cron表達式 一個字符串&#xff0c;通過cron表達式可以定義任務觸發的時間 **構成規則&#xff1a;**分為6或7個域&#xff0c;由空格分隔開&#xff0c;每個域代表一個含義 …

Android Native 之 inputflinger進程分析

Android IMS原理解析 - 簡書 Android 輸入事件分發全流程梳理&#xff08;一&#xff09;_android input事件分發流程-CSDN博客 Android 輸入事件分發全流程梳理&#xff08;二&#xff09;_android輸入事件流程圖-CSDN博客 inputflinger模塊與surfaceflinger模塊在同級目錄…

Python實例題:基于 Flask 的在線聊天系統

目錄 Python實例題 題目 要求&#xff1a; 解題思路&#xff1a; 代碼實現&#xff1a; Python實例題 題目 基于 Flask 的在線聊天系統 要求&#xff1a; 使用 Flask 框架構建一個實時在線聊天系統&#xff0c;支持以下功能&#xff1a; 用戶注冊、登錄和個人資料管理…

v-bind指令

好的&#xff0c;我們來學習 v-bind 指令。這個指令是理解 Vue 數據驅動思想的基石。 核心功能&#xff1a;v-bind 的作用是將一個或多個 HTML 元素的 attribute (屬性) 或一個組件的 prop (屬性) 動態地綁定到 Vue 實例的數據上。 簡單來說&#xff0c;它在你的數據和 HTML …

【設計模式04】單例模式

前言 整個系統中只會出現要給實例&#xff0c;比如Spring中的Bean基本都是單例的 UML類圖 無 代碼示例 package com.sw.learn.pattern.B_create.c_singleton;public class Main {public static void main(String[] args) {// double check locking 線程安全懶加載 ?? //…

飛算科技依托 JavaAI 核心技術,打造企業級智能開發全場景方案

在數字經濟蓬勃發展的當下&#xff0c;企業對智能化開發的需求愈發迫切。飛算數智科技&#xff08;深圳&#xff09;有限公司&#xff08;簡稱 “飛算科技”&#xff09;作為自主創新型數字科技公司與國家級高新技術企業&#xff0c;憑借深厚的技術積累與創新能力&#xff0c;以…

20250701【二叉樹公共祖先】|Leetcodehot100之236【pass】今天計劃

20250701 思路與錯誤記錄1.二叉樹的數據結構與初始化1.1數據結構1.2 初始化 2.解題 完整代碼今天做了什么 題目 思路與錯誤記錄 1.二叉樹的數據結構與初始化 1.1數據結構 1.2 初始化 根據列表&#xff0c;順序存儲構建二叉樹 def build_tree(nodes, index0):# idx是root開始…

Web應用開發 --- Tips

Web應用開發 --- Tips General后端需要做參數校驗代碼風格和Api設計風格的一致性大于正確性數據入庫時間應由后端記錄在對Api修改的時候&#xff0c;要注意兼容情況&#xff0c;避免breaking change 索引對于查詢字段&#xff0c;注意加索引對于唯一的字段&#xff0c;考慮加唯…