每周分享之《JSR303 Bean Validation介紹以及在項目中的使用》

来源:https://www.cnblogs.com/itcoder007/archive/2018/01/04/8189324.html
-Advertisement-
Play Games

項目中參數校驗,用到JSR 303,在此總結梳理下知識脈絡,拋磚引玉。 一、基礎 1.What is JSR? JSR是Java Specification Requests的縮寫,意思是Java 規範提案。任何人都可以提交JSR,以向Java平臺增添新的API和服務。JSR已成為Java界的一個重 ...


 

 

 

 

項目中參數校驗,用到JSR 303,在此總結梳理下知識脈絡,拋磚引玉。

一、基礎

1.What is JSR?

  JSR是Java Specification Requests的縮寫,意思是Java 規範提案。任何人都可以提交JSR,以向Java平臺增添新的API和服務。JSR已成為Java界的一個重要標準。

2.Why use JSR 303?

  問題:在通常的情況下,應用程式是分層的,不同的層由不同的開發人員來完成。很多時候同樣的數據驗證邏輯會出現在不同的層,這樣耗時且容易出錯,導致代碼冗餘和一些管理的問題。

             

 

  想法:為了避免這樣的情況發生,最好是將驗證邏輯與相應的域模型進行綁定。(開發者更傾向於將驗證規則直接放到 Java Bean 本身,使用註解的方式進行驗證規則的設計。)  

  解決方案:Bean Validation為JavaBean 驗證定義了相應的元數據模型(註解)和 API,它是一個運行時的數據驗證框架,來使用其定義的驗證檢查JavaBean屬性值,在驗證之後驗證的錯誤信息會被馬上返回(Hibernate Validator 是 Bean Validation 的參考實現 ,提供了 JSR 303 規範中所有內置 constraint 的實現,除此之外還有一些附加的 constraint)。

3.常用

·空檢查

  @NotNull 驗證對象 是否不為null, 無法查檢長度為0的字元串

  @NotEmpty 檢查約束元素(String類、Collection、Map、數組)是否為NULL或者是EMPTY(實際意義等同於 @NotNull 和 @Size(min=1)的組合)

  @NotBlank 檢查約束字元串 是不是Null還有被Trim的長度是否大於0,只對字元串,且會去掉前後空格

·長度檢查

  @Length(max, min) Validates that the annotated 字元串 is between min and max included.

  @Size(max, min) 驗證對象(Array,Collection,Map,String)長度是否在給定的範圍之內

·數字大小

  @Min(value) 驗證 Number 和 String 對象是否大等於指定的值

  @Max(value) 驗證 Number 和 String 對象是否小等於指定的值

  @Range(min, max) 檢查數字是否介於min和max之間

  @DecimalMin 驗證 Number 和 String 對象是否大等於指定的值,這個約束的參數是一個通過BigDecimal定義的最小值的字元串表示,小數存在精度

  @DecimalMax 驗證 Number 和 String 對象是否小等於指定的值,這個約束的參數是一個通過BigDecimal定義的最大值的字元串表示,小數存在精度

註:上述註解具體對象為 BigDecimal,BigInteger, byte,short, int, long等任何Number或CharSequence(存儲的是數字)子類型。

·小數精度

  @Digits (integer, fraction) 驗證 Number 和 String 的構成是否合法(符合指定格式的數字),integer是整數精度(整數位數上限),fraction是小數精度(小數位數上限)

4.constraint (約束)

  通常由 annotation 和相應的 constraint validator 組成,它們是一對多的關係。在運行時,Bean Validation 框架本身會根據被註釋元素的類型來選擇合適的 constraint validator 對數據進行驗證。(自己也可使用內置的constraint定製化所需constraint,或者新開發constraint — 繼承ConstraintValidator)

、高級

1.嵌套(遞歸)校驗  

  場景:被校驗JavaBean 包含的屬性,有的是引用類型且包含需要校驗的參數

  使用方式:該屬性前面聲明@Valid,才會對屬性對象內的註解進行驗證,否則將不予驗證;如果關聯對象是個集合或者數組,那麼對其中的元素進行遞歸校驗,如果是一個map,則對其中的值部分進行校驗。

2.

  場景:對接不同項目,有些參數有時是需要的,有時又是不需要的;再比如說對於一個實體類來的id來說,保存的時候是不需要的,對於更新時是必須的

  使用方式:@Validated( { First.class, Second.class }) ,@Valid(groups=GroupA.class),@NotEmpty(message = "lastname may be empty",groups = GroupA.class)

  作用:無需對該對象中所有的約束進行驗證,只需要對該組定義的一個子集進行驗證即可

3.自定義constraint (約束)

 4.非參數校驗的位置

  其實在整個程式的任何地方都可以調用 JSR 303 API 去對數據進行校驗,然後將校驗後的結果返回:

流程:

 

結束語

  把項目中的問題作為切入點,這次整理讓我自己受益良多:更加清楚地梳理&充實了知識框架,也瞭解到了更多工作時不一定用到的知識(可以作為本人待探索的領域)。  接下來,要解決自己一直以來的軟肋,要動手創建項目 to 實踐整理出的理論。

 

參考文章

1.JSR 303 - Bean Validation 介紹及最佳實踐 https://www.ibm.com/developerworks/cn/java/j-lo-jsr303/

2.百度百科

3.Java的Validator框架概述 http://blog.csdn.net/zhu_tianwei/article/details/43272181

4.http://blog.csdn.net/wangpeng047/article/details/41726299

5.https://www.cnblogs.com/yangzhilong/p/3724967.html

6.http://jinnianshilongnian.iteye.com/blog/1733708

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • json相信大家都用的多,jsonp我就一直沒有機會用到,但也經常看到,只知道是“用來跨域的”,一直不知道具體是個什麼東西。今天總算搞明白了。下麵一步步來搞清楚jsonp是個什麼玩意。 同源策略 首先基於安全的原因,瀏覽器是存在同源策略這個機制的,同源策略阻止從一個源載入的文檔或腳本獲取或設置另一個 ...
  • 對於一個多人團隊來說,制定一個統一的規範是必要的,因為個性化的東西無法產生良好的聚合效果,規範化可以提高編碼工作效率,使代碼保持統一的風格,以便於代碼整合和後期維護。 2.1 瀏覽器相容 根據公司業務要求而定,一般: 主流程測試:Chrome 30+、IE9+; 完整測試: Chrome 21、IE ...
  • 1、vertical-align基本認識 支持的屬性值: ①線類:baseline(預設),top,middle,bottom ②文本類:text-top,text-bottom ③上標下標類:sub,super ④數值百分比類: 數值和百分比的共性:ⅰ都帶數字;ⅱ都支持負值;ⅲ行為表現一致(都是在 ...
  • 一、表單輸入綁定 1.1、基礎用法 你可以用 v-model 指令在表單控制項元素上創建雙向數據綁定。它會根據控制項類型自動選取正確的方法來更新元素。儘管有些神奇,但 v-model 本質上不過是語法糖,它負責監聽用戶的輸入事件以更新數據,並特別處理一些極端的例子。 v-model 並不關心表單控制項初始 ...
  • 上文說到,有了Spring之後,通過依賴註入的方式,我們的業務代碼不用自己管理關聯對象的生命周期。業務代碼只需要按照業務本身的流程,走啊走啊,走到哪裡,需要另外的對象來協助了,就給Spring說,我想要個對象——於是Spring就很貼心的給你個對象。聽起來似乎很簡單,使用起來也不難,但是如果僅僅是這 ...
  • 寫在開始 小程式升級實時音視頻錄製及播放能力,開放 Wi Fi、NFC(HCE) 等硬體連接功能。同時提供按需載入、自定義組件和更多訪問層級等新特性,增強了第三方平臺的能力,以滿足日趨豐富的業務需求。 為更高效地連接用戶與商家,小程式提供了實時音視頻錄製及播放組件。符合類目要求的小程式自助開通後,可 ...
  • 概要 瞭解數據 分析數據問題 清洗數據 整合代碼 瞭解數據 在處理任何數據之前,我們的第一任務是理解數據以及數據是乾什麼用的。我們嘗試去理解數據的列/行、記錄、數據格式、語義錯誤、缺失的條目以及錯誤的格式,這樣我們就可以大概瞭解數據分析之前要做哪些“清理”工作。 本次我們需要一個 patient_h ...
  • ngrok介紹 是一個反向代理軟體,最早是因為微信調試需要而使用。後來發現用途不少,我常用的主要是以下方面: 微信調試; 需要,比如第三方登陸或者支付的 ; 對隧道中的 請求抓包分析; 將區域網的 埠映射出來(比如你的朋友請你遠程技術支持 ,通過此方式可以直接 到對方電腦,不要用慢吞吞的遠程桌面了 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...