JSR 303(即 Bean Validation)是一個通過??注解在 Java Bean 上定義和執行驗證規則??的規范

🛠? 一、JSR 303是什么?

JSR 303(Java Specification Requests 303)是Java EE 6的子規范,全稱??Bean Validation??。它通過注解方式對JavaBean的屬性值進行標準化校驗,例如檢查非空、長度、格式等規則。其參考實現是??Hibernate Validator??(與Hibernate ORM無關)

??核心價值??:
? 將校驗邏輯從業務代碼剝離,提升代碼可維護性
? 統一校驗規則,避免重復編碼
? 支持編譯時和運行時校驗,增強數據安全性(防止惡意繞過前端校驗)


?? 二、快速入門:基礎使用

1?? 環境搭建
  • ??Spring Boot項目??:添加依賴:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>
  • ??非Spring項目??:需手動引入validation-apihibernate-validator
2?? 常用內置注解
注解適用類型說明示例
@NotNull任意值不能為null@NotNull(message="ID不能為空")
@NotBlankString非null且去除空格后長度>0@NotBlank(message="用戶名必填")
@Size集合/String長度在指定范圍內@Size(min=6, max=20, message="密碼需6-20位")
@EmailString郵箱格式校驗@Email(message="郵箱格式無效")
@PatternString正則表達式匹配@Pattern(regexp="^1[3-9]\\d{9}$", message="手機號格式錯誤")
@Min/@Max數字類型數值范圍限制@Min(value=18, message="年齡需≥18")
3?? 在Controller中使用

通過@Valid@Validated觸發校驗:

@PostMapping("/user")
public ResponseEntity<String> createUser(@Valid @RequestBody UserDTO user) {// 校驗通過才執行業務邏輯return ResponseEntity.ok("創建成功");
}
  • 校驗失敗會拋出MethodArgumentNotValidException,需全局異常處理

? 三、進階技巧

1?? 分組校驗

解決同一字段在不同場景(如新增/修改)下的差異化校驗需求:

// 定義分組接口
public interface AddGroup {}
public interface UpdateGroup {}// 實體類中使用
public class User {@Null(groups = AddGroup.class, message = "新增時ID必須為空")@NotNull(groups = UpdateGroup.class, message = "修改時ID不能為空")private Long id;
}// Controller指定分組
@PostMapping("/update")
public R update(@Validated(UpdateGroup.class) @RequestBody User user) {// ...
}

注:未分組的注解在分組校驗中不生效

2?? 自定義校驗

??步驟??:

  1. ??定義注解??:
    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = ListValueConstraintValidator.class)
    public @interface ListValue {String message() default "值不在可選范圍內";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};int[] vals() default {};  // 允許的值列表,如[0,1]
    }

  2. ??實現校驗器??:
    public class ListValueConstraintValidator implements ConstraintValidator<ListValue, Integer> {private Set<Integer> set = new HashSet<>();@Overridepublic void initialize(ListValue constraintAnnotation) {for (int val : constraintAnnotation.vals()) {set.add(val);}}@Overridepublic boolean isValid(Integer value, ConstraintValidatorContext context) {return set.contains(value);}
    }

  3. ??使用自定義注解??:
    @ListValue(vals = {0, 1}, message = "狀態只能是0或1")
    private Integer status;


💎 四、常見問題

  • ??Q:@Valid?vs?@Validated???

    • @Valid(JSR標準):不支持分組,可嵌套校驗字段。
    • @Validated(Spring擴展):支持分組,不可用于字段
  • ??Q:校驗失敗如何獲取具體錯誤???
    在Controller參數中添加BindingResult result,通過result.getFieldErrors()遍歷錯誤詳情

  • ??Q:為什么int類型推薦用Integer???
    @Min等注解在基本類型(如int)上無法處理空值,而Integer可兼容null校驗


📚 總結

JSR 303通過??聲明式注解??簡化數據校驗。初學者可逐步掌握:
1?? 基礎注解 → 2?? Controller集成 → 3?? 分組/自定義校驗 → 4?? 全局異常處理
結合Spring生態(如Spring MVC)能極大提升開發效率和系統健壯性

更多實踐參考:Hibernate Validator文檔或Spring官方教程。

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

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

相關文章

【圖像處理入門】3. 幾何變換基礎:從平移旋轉到插值魔法

摘要 掌握圖像的幾何變換相當于學會「圖像的空間魔法」。本文將帶你理解平移/旋轉/縮放的數學原理&#xff0c;掌握OpenCV中warpAffine和getAffineTransform的核心用法&#xff0c;對比最近鄰、雙線性等插值算法的優劣。通過圖像翻轉、鏡像、透視變換實戰&#xff0c;學會用變…

微信小程序學習目錄

個人簡介 &#x1f468;?&#x1f4bb;?個人主頁&#xff1a; 魔術師 &#x1f4d6;學習方向&#xff1a; 主攻前端方向&#xff0c;正逐漸往全棧發展 &#x1f6b4;個人狀態&#xff1a; 研發工程師&#xff0c;現效力于政務服務網事業 &#x1f1e8;&#x1f1f3;人生格言&…

QT 5.15.2 程序中文亂碼

1. 在.pro文件中添加&#xff1a; msvc { QMAKE_CXXFLAGS /source-charset:utf-8 /execution-charset:utf-8 }備注&#xff1a;.pro文件只有在選擇 qmake 方式才會生成。 [Cmake 只會生成 CMakeLists.txt 文件] 2. 在文件首部增加以下程序行 #pragma execution_character_s…

Unity UI設計優化與模式原則

前言 在 Unity 中設計高效且可維護的 UI 系統時&#xff0c;需要結合性能優化和設計模式兩大核心方向。以下是關鍵原則及實踐方法&#xff1a; 對惹&#xff0c;這里有一個游戲開發交流小組&#xff0c;希望大家可以點擊進來一起交流一下開發經驗呀&#xff01; 一、UI 性能…

CppCon 2014 學習: The Implementation of Value Types

“The Implementation of Value Types” 在C里&#xff0c;通常指的是如何設計和實現**值類型&#xff08;value types&#xff09;**的類&#xff0c;確保它們符合值語義&#xff08;value semantics&#xff09;&#xff0c;也就是說&#xff1a; 對象的賦值和拷貝操作應該是…

每日算法刷題Day19 5.31:leetcode二分答案3道題,用時1h

6. 475.供暖器(中等&#xff0c;學習check函數雙指針思想) 475. 供暖器 - 力扣&#xff08;LeetCode&#xff09; 思想 1.冬季已經來臨。 你的任務是設計一個有固定加熱半徑的供暖器向所有房屋供暖。在加熱器的加熱半徑范圍內的每個房屋都可以獲得供暖。現在&#xff0c;給出…

【計算機網絡】第2章:應用層—應用層協議原理

目錄 1. 網絡應用的體系結構 2. 客戶-服務器&#xff08;C/S&#xff09;體系結構 3. 對等體&#xff08;P2P&#xff09;體系結構 4. C/S 和 P2P 體系結構的混合體 Napster 即時通信 5. 進程通信 6. 分布式進程通信需要解決的問題 7. 問題1&#xff1a;對進程進行編址…

PHP+MySQL開發語言 在線下單訂水送水小程序源碼及搭建指南

隨著互聯網技術的不斷發展&#xff0c;在線下單訂水送水服務為人們所需要。分享一款 PHP 和 MySQL 搭建一個功能完善的在線訂水送水小程序源碼及搭建教程。這個系統將包含用戶端和管理端兩部分&#xff0c;用戶可以在線下單、查詢訂單狀態&#xff0c;管理員可以處理訂單、管理…

vBulletin未認證API方法調用漏洞(CVE-2025-48827)

免責聲明 本文檔所述漏洞詳情及復現方法僅限用于合法授權的安全研究和學術教育用途。任何個人或組織不得利用本文內容從事未經許可的滲透測試、網絡攻擊或其他違法行為。使用者應確保其行為符合相關法律法規,并取得目標系統的明確授權。 對于因不當使用本文信息而造成的任何直…

計算機模擬分子合成有哪些應用軟件?

參閱&#xff1a;Top 創新大獎 以下是用于計算機模擬分子合成&#xff08;包括逆合成設計、分子對接、分子動力學模擬及綜合設計平臺&#xff09;的主流應用軟件分類總結&#xff0c;結合其核心功能和應用場景進行整理&#xff1a; &#x1f52c; 一、逆合成設計與路線規劃軟件…

Excel 中的SUMIFS用法(基礎版),重復項求和

1. 首先復制篩選條件所在的列&#xff0c;去除重復項目 數據 》重復項 》刪除重復項 2. 輸入函數公式 SUMIFS(C:C,A:A,E2) 3. 選中單元格&#xff0c;通過 ShiftF3 查看函數參數 第一個參數&#xff1a;求和區域&#xff0c;要累加的值所在的區域范圍 第二個參數&#xff1a…

【xmb】內部文檔148344597

基于小米CyberDog 2的自主導航與視覺感知系統設計報告 摘要&#xff1a; 本文針對2025年全國大學生計算機系統能力大賽智能系統創新設計賽&#xff08;小米杯&#xff09;初賽要求&#xff0c;設計并實現了基于小米仿生四足機器人CyberDog 2的平臺系統方案。參賽作品利用Cyber…

從零開始理解機器學習:知識體系 + 核心術語詳解

你可能聽說過“機器學習”&#xff0c;覺得它很神秘&#xff0c;像是讓電腦自己學會做事。其實&#xff0c;機器學習的本質很簡單&#xff1a;通過數據來自動建立規則&#xff0c;從而完成預測或決策任務。 這篇文章將帶你系統梳理機器學習的知識體系&#xff0c;并用貼近生活…

springboot集成websocket給前端推送消息

一般通常情況下&#xff0c;我們都是前端主動朝后端發送請求&#xff0c;那么有沒有可能&#xff0c;后端主動給前端推送消息呢&#xff1f;這時候就可以借助websocket來實現。下面給出一個簡單的實現樣例。 首先創建一個websocketDemo工程&#xff0c;該工程的整體結構如下&a…

【清晰教程】查看和修改Git配置情況

目錄 查看安裝版本 查看特定配置 查看全局配置 查看本地倉庫配置 設置或修改配置 查看安裝版本 打開命令行工具&#xff0c;通過version命令檢查Git版本號。 git --version 如果顯示出 Git 的版本號&#xff0c;說明 Git 已經成功安裝。 查看特定配置 如果想要查看特定…

【Github/Gitee Webhook觸發自動部署-Jenkins】

Github/Gitee Webhook觸發自動部署-Jenkins #mermaid-svg-hRyAcESlyk5R2rDn {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hRyAcESlyk5R2rDn .error-icon{fill:#552222;}#mermaid-svg-hRyAcESlyk5R2rDn .error-tex…

C語言數據結構-鏈式棧

頭文件&#xff1a;stack.h #ifndef __STACK_H__ #define __STACK_H__ #include <stdio.h> #include <stdlib.h> typedef int DataType; /* 鏈式棧節點類型 */ typedef struct staNode { DataType data; struct staNode *pNext; }StackNode; /* 鏈式棧…

M4Pro安裝ELK(ElasticSearch+LogStash+Kibana)踩坑記錄

ElasticSearch安裝&#xff0c;啟動端口9200&#xff1a; docker pull elasticsearch:8.13.0 新增配置文件elasticsearch.yml&#xff1a; cd /opt/homebrew/etc/ mkdir elasticsearch_config cd elasticsearch_config vi elasticsearch.yml cluster.name: "nfturbo…

uni-app學習筆記十六-vue3頁面生命周期(三)

uni-app官方文檔頁面生命周期部分位于頁面 | uni-app官網。 本篇再介紹2個生命周期 1.onUnload&#xff1a;用于監聽頁面卸載。 當頁面被關閉時&#xff0c;即頁面的緩存被清掉時觸發加載onUnload函數。 例如:在demo6頁面點擊跳轉到demo4&#xff0c;在demo4頁面回退不了到d…

Java互聯網大廠面試:從Spring Boot到Kafka的技術深度探索

Java互聯網大廠面試&#xff1a;從Spring Boot到Kafka的技術深度探索 在某家互聯網大廠的面試中&#xff0c;面試官A是一位技術老兵&#xff0c;而被面試者謝飛機&#xff0c;號稱有豐富的Java開發經驗。以下是他們的面試情景&#xff1a; 場景&#xff1a;電商平臺的后端開發…