Spring Boot 參數校驗:@Valid 與 @Validated

在這里插入圖片描述

在日常開發中,參數校驗是保障接口健壯性與數據安全的第一道防線。Spring Boot 為我們提供了基于 JSR-303/JSR-380 的強大校驗機制,通過注解與 AOP 實現了靈活且高效的數據校驗方式。本篇博客將詳細介紹 Spring Boot 中 @Valid@Validated 注解的使用方法,并深入解析其背后的原理與擴展能力。


一、引入依賴

Spring Boot 項目中默認支持 javax.validation,但建議顯式引入:

<!-- Hibernate Validator 是實現規范最廣的一個實現 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>

二、基礎注解使用

在 Java Bean 上添加注解,示例:

public class UserDTO {@NotBlank(message = "用戶名不能為空")private String username;@Email(message = "郵箱格式不正確")private String email;@Min(value = 18, message = "年齡必須 >= 18")@Max(value = 100, message = "年齡必須 <= 100")private Integer age;// Getter / Setter
}

三、在 Controller 中啟用校驗

1. 使用 @Valid(javax.validation)注解:

@RestController
@RequestMapping("/user")
public class UserController {@PostMapping("/create")public ResponseEntity<String> createUser(@Valid @RequestBody UserDTO user) {return ResponseEntity.ok("創建成功");}
}

2. 使用 @Validated(Spring 提供)支持 分組校驗

public class UserDTO {@NotBlank(message = "用戶名不能為空", groups = Create.class)private String username;public interface Create {}
}
@PostMapping("/create")
public ResponseEntity<String> createUser(@Validated(UserDTO.Create.class) @RequestBody UserDTO user) {return ResponseEntity.ok("按分組校驗通過");
}

四、校驗嵌套對象

public class OrderDTO {@NotNull@Valid // 注意:嵌套對象必須加 @Valid 才能觸發其內部校驗private UserDTO user;
}

五、處理校驗失敗異常

Spring Boot 默認拋出 MethodArgumentNotValidException(@Valid)或 ConstraintViolationException(@Validated)。

可以通過全局異常處理捕獲并格式化返回:

@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(MethodArgumentNotValidException.class)public ResponseEntity<?> handleValidException(MethodArgumentNotValidException ex) {String errorMsg = ex.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining("; "));return ResponseEntity.badRequest().body("參數錯誤:" + errorMsg);}
}

六、自定義校驗注解

1. 自定義注解:

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {PhoneValidator.class})
public @interface Phone {String message() default "手機號格式不正確";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}

2. 編寫校驗器:

public class PhoneValidator implements ConstraintValidator<Phone, String> {private static final Pattern PATTERN = Pattern.compile("^1[3-9]\\d{9}$");@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {return value != null && PATTERN.matcher(value).matches();}
}

3. 使用:

@Phone
private String phone;

七、常用校驗注解速查表

注解功能說明
@NotNull不能為 null
@NotEmpty不能為 null 且長度 > 0
@NotBlank不能為 null 且去空格后長度 > 0
@Email郵箱格式
@Min最小值限制
@Max最大值限制
@Pattern正則校驗
@Size長度范圍校驗
@Future必須是未來時間
@Past必須是過去時間

八、注意事項與最佳實踐

  • 嵌套校驗字段必須加 @Valid
  • @Validated 支持分組、@Valid 不支持。
  • 實體類字段建議使用包裝類型(如 Integer 而非 int),避免 null 時校驗器報錯。
  • 參數校驗推薦配合統一響應結構,提升開發與調試體驗。

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

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

相關文章

linux看門狗重啟定位思路總結

1&#xff0c;看門狗定位思路&#xff08;1&#xff09;是否是死鎖導致查看日志查看是否有RCU install或者deadlock相關打印&#xff0c;如果有的話可以考慮使用lockdep死鎖檢測工具&#xff08;2&#xff09;中斷風暴查看中斷&#xff0c;抓中斷打印&#xff0c;可以查看/proc…

基于單片機直流電機測速中文液晶顯示設計

摘 要 在現在工業自動化高度發展的時期&#xff0c;幾乎所有的工業設備都離不開旋轉設備&#xff0c;形形色色的電機在不同領域發揮著很重要的作用。不同場合對電機控制要求是不同的&#xff0c;但大部分都會涉及到旋轉設備的轉速測量&#xff0c;從而利用轉速來實施對旋轉設備…

c# sqlsugar 主子表明細 查詢

在使用 SqlSugar ORM 進行數據庫操作時&#xff0c;特別是在處理主子表關系時&#xff0c;通常需要執行關聯查詢來獲取主表和其子表的數據。SqlSugar 提供了強大的查詢能力&#xff0c;支持多種方式的關聯查詢&#xff0c;包括左連接&#xff08;Left Join&#xff09;、內連接…

研華PCI-1285/1285E 系列------(一概述)

PCI-1285/1285E 系列是基于 DSP 的 SoftMotion PCI 總線控制器卡,專為各種電機自動 化和其它機器自動化的廣泛應用設計。板卡配有高性能 DSP,其中包括 SoftMotion算法,能夠實現運動軌跡和時間控制,以滿足精確運動中的同步應用需求。 研華 SoftMotion 支持以下特性:龍門…

二代身份證識別技術的發展:從機器學習到深度學習

一、技術發展歷程1. 傳統機器學習時代&#xff08;2000-2012&#xff09;特征工程方法&#xff1a;主要依賴手工設計的特征&#xff08;HOG、SIFT、LBP等&#xff09;分類器技術&#xff1a;支持向量機(SVM)、隨機森林、AdaBoost等OCR技術&#xff1a;基于模板匹配和連通區域分…

云服務器如何設置防火墻和安全組規則?

一、安全組&#xff08;Security Group&#xff09;設置安全組是云平臺提供的虛擬防火墻&#xff0c;用于控制 入站&#xff08;Ingress&#xff09;和出站&#xff08;Egress&#xff09;流量。1. 基本安全組規則&#xff08;推薦&#xff09;協議端口源IP用途是否必需TCP22你…

排序【各種題型+對應LeetCode習題練習】

目錄 常用排序 快速排序 LeetCode 912 排序數組 歸并排序 LeetCode 912 排序數組 常用排序 名稱排序方式時間復雜度是否穩定快速排序分治O(n log n)否歸并排序分治O(n log n)是冒泡排序交換O(n)是插入排序插入O(n)是選擇排序選擇最值O(n)否C STL sort快排內省排序O(n log…

鴻蒙與web混合開發雙向通信

鴻蒙與web混合開發雙向通信用runJavaScript和registerJavaScriptProxy web entry/src/main/resources/rawfile/1.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content&q…

unity Physics.RaycastNonAlloc

Physics.RaycastNonAlloc 是 Unity 中用于 3D 物理射線檢測的高性能方法&#xff0c;它是 Physics.Raycast 的非分配版本。 方法簽名 public static int RaycastNonAlloc(Ray ray, RaycastHit[] results, float maxDistance Mathf.Infinity, int layerMask DefaultRaycastLay…

數據庫(five day finally)——物物而不物于物,念念而不念于念。(數據庫到此結束!祝世間美好與各位不期而遇,善意常伴汝身!)

1.子查詢&#xff08;1&#xff09;where 子查詢①多行單列配合in和not in操作&#xff08;類似于數據范圍查詢&#xff09;例&#xff1a;顯示工資與各個經理相同的雇員信息&#xff08;包含經理本身&#xff09;。select * from empwhere sal(select sal from emp where jobM…

【甲烷數據集】Sentinel-5P 衛星獲取的全球甲烷數據集-TROPOMI L2 CH?

目錄 數據概述 傳感器 & 衛星信息 監測目標:甲烷(CH?) 數據產品內容 空間與時間覆蓋 云篩選與協同觀測 技術文檔資源 數據下載 Python 代碼繪制 CH4 數據 參考 數據概述 Sentinel-5 Precursor Level 2 Methane (TROPOMI L2 CH?) 數據集是由歐洲哥白尼計劃的 Sentinel…

【數據結構】單鏈表練習(有環)

1.判斷是否是環形鏈表 141. 環形鏈表 - 力扣&#xff08;LeetCode&#xff09; bool hasCycle(struct ListNode *head) {struct ListNode *fast,*slow;fastslowhead;while(fast&&fast->next){fastfast->next->next;slowslow->next;if(fastslow)return tr…

VR 污水廠初體驗:顛覆傳統認知?

第一次戴上 VR 設備走進 VR 污水廠時&#xff0c;那種震撼的感覺至今難以忘懷。仿佛一瞬間&#xff0c;我被傳送到了一個全新的世界&#xff0c;平日里只能在圖紙或實地看到的污水廠&#xff0c;此刻就立體地呈現在眼前。腳下是縱橫交錯的管道&#xff0c;頭頂巨大的處理設備有…

父類 div 自適應高度 子類如何撐滿其高度

使用絕對定位 如果你想要子元素完全撐滿父元素的高度&#xff0c;可以使用絕對定位。這種方法適用于當子元素需要完全覆蓋父元素時。<div class"parent"><div class"child"><!-- 子類內容 --></div> </div>.parent {positio…

從0開始學習R語言--Day51--PH檢驗

在用cox回歸做分析時&#xff0c;我們一般會得出各種變量在結局的風險影響&#xff08;HR大于1&#xff0c;就代表變量值增大&#xff0c;對應結局影響的風險就隨之增大&#xff09;&#xff0c;但是這里有個壞處是&#xff0c;cox回歸得到的是瞬時風險值&#xff0c;我們最多得…

Docker 網絡原理

Linux 常見網絡虛擬化 虛擬網卡:tun/tap虛擬網卡&#xff08;又稱虛擬網絡適配器&#xff09;&#xff0c;即用軟件模擬網絡環境&#xff0c;模擬網絡適配器。在計算機網絡中&#xff0c;tun 與 tap 是操作系統內核中的虛擬網絡設備。不同于普通靠硬件網絡適配器實現的設備&…

【通識】PCB文件

1. PCB文件的導入 在PORTEL99 PCB編輯器的文件菜單中選擇導入先前繪制的CAD文件。導入成功后&#xff0c;編輯器將顯示出元件封裝的基本圖形&#xff0c;為后續操作奠定基礎。將需要抄板的PCB放置于掃描儀中隨后啟動掃描儀&#xff0c;之后啟動AUTO CAD軟件&#xff0c;之后插入…

分布式彈性故障處理框架——Polly(1)

1 前言之服務雪崩 在我們實施微服務之后&#xff0c;服務間的調用變得異常頻繁&#xff0c;多個服務之前可能存在互相依賴的關系&#xff0c;當某個服務出現故障或者是因為服務間的網絡出現故障&#xff0c;導致服務調用的失敗&#xff0c;進而影響到某個業務服務處理失敗&…

【機器學習深度學習】大模型推理速度與私有化部署的價值分析

目錄 前言 一、主流推理框架速度對比 二、為什么 HuggingFace 框架更適合微調驗證&#xff1f; 三、大模型私有化部署的必要性分析 ? 私有化部署的主要動因 1. 數據隱私與業務安全 2. 可控性與性能保障 ? 哪些情況不建議私有部署&#xff1f; 四、總結與選型建議 &…

elementui-admin構建

1、vue-element-admin vue-element-admin是基于element-ui 的一套后臺管理系統集成方案。 功能&#xff1a;介紹 | vue-element-adminA magical vue adminhttps://panjiachen.github.io/vue-element-admin-site/zh/guide/# GitHub地址&#xff1a;https://github.com/PanJia…