在任何時候,當你要處理一個應用程式的商業邏輯,資料校驗是你必須要考慮和麵對的事情。應用程式必須透過某種手段來確保輸入進來的資料從語義上來講是正確的。在通常的情況下,應用程式是分層的,不同的層由不同的開發人員來完成。很多時候同樣的資料驗證邏輯會出現在不同的層,這樣就會導致程式碼冗餘和一些管理的問題,比如說語意的一致性等。為了避免這樣的情況發生,最好是將驗證邏輯與對應的領域模型進行綁定。
Bean Validation 為 JavaBean 驗證定義了對應的元資料模型和API。預設的元資料是 Java Annotations,透過使用 XML 可以對原有的元資料資訊進行覆寫和擴展。 Bean Validation 是一個運行時的資料驗證框架,在驗證之後驗證的錯誤訊息會馬上回傳。
Hibernate Validator 是 Bean Validation 的參考實作 . Hibernate Validator 提供了 JSR 303 規範中所有內建 constraint 的實現,除此之外還有一些附加的 constraint。
##1.4 Hibernate Validator 的優點a) 驗證邏輯與商業邏輯之間進行了分離,並降低了程式耦合度; ##b) 統一且規範的驗證方式,無需你再次寫出重複的驗證程式碼;c) 你將更專注於你的業務,並將這些繁瑣的事情統統丟在一邊。 2. Hibernate Validator實作 2.1 引入相關jar套件maven依賴:< ;dependency>
&1 version>4.2.0 .Final
2.2 SpringMvc中設定#這篇文章的demo是基於springmvc的,需要進行相關配置。
#2.3 新增constraint ##############################如圖為User添加了幾個constraint:對name添加了不為空和長度的約束;對sex添加了自定義的約束,後面會加以介紹;對role的約束為對象內嵌約束。 JSR-303的校驗是基於註解的,它內部已經定義好了一系列的限制註解,我們只需要把這些註解標記在需要驗證的實體類別的屬性上或是其對應的get方法上。 ###### ######2.4 自訂的constraint####### ######### 如圖定義了一個ValidSex的註解,並且在註解上標註了@Constraintintintends 如圖定義了一個ValidSex的註解,在註解上標註了@Constraintintintends ,使用@Constraint註解標註顯示我們定義了一個用於限制的註解。 @Constraint註解的validatedBy屬性用於指定我們定義的當前限制類型需要被哪個ConstraintValidator進行校驗。在上面程式碼中我們指定了ValidSex限制類型的校驗類別是ValidSexValidator。另外要注意的是我們在定義自己的限制類型的註解時有三個屬性是必須定義的,如上面程式碼所示的message、groups和payload屬性。 ###### ######2.5 自訂的 constraint實作類別###### ######## 如圖,ConstraintValidator是使用了泛型的。它總共需要指定兩種類型,第一個類型是對應的initialize方法的參數類型,第二個類型是對應的isValid方法的第一個參數類型。從上面的兩個方法我們可以看出initialize方法是可以取得到目前的限制類型的屬性,isValid方法是用來進行校驗的。 ###### ######2.6 對參數進行校驗###### #######
在上圖中我們可以看到我們定義了一個LoginController,該Controller有一個處理validator操作的處理器方法validator,它需要接收客戶端發送的一個User對象,我們就是要利用前面的Validator對該User物件進行校驗。首先我們可以看到我們validator方法接收的參數user是用@Valid進行標註的。另外我們的處理器方法必須給定包含Errors的參數,這可以是Errors本身,也可以是它的子類BindingResult,使用了Errors參數就是告訴Spring關於表單物件資料校驗的錯誤將由我們自己來處理,否則Spring會直接拋出異常。這樣當我們請求處理器方法validator時就會對user物件進行校驗,並把相關的校驗資訊存放到目前的Errors物件中。接著我們就可以在我們的處理器方法中根據是否有校驗異常資訊來做不同的操作。在上面程式碼中我們定義了在有異常訊息的時候就跳到登陸頁面。這樣我們就可以在登陸頁面上透過errors標籤來展示這些錯誤訊息了。
a) 如果驗證的是屬性(getter 方法),那麼必須遵循Java Bean 的命名習慣(JavaBeans 規格);
b) 靜態的欄位與方法不能進行限制驗證;
c) 限制適用於介面與基底類別;
d) 限制註解定義的目標元素可以是欄位、屬性或型別等;
#de) 可以在類別或介面上使用約束驗證,它將對該類別或實作該介面的實例進行狀態驗證;
f) 欄位和屬性都可以使用約束驗證,但無法將相同的約束重複聲明在欄位和相關屬性(欄位的getter 方法)上。
結語:善待身邊每一個人,因為,是他們成就了你的人生。
以上是Hibernate_Validator詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!