天天看點

Java EE 6核心特征:Bean Validation解析

    Bean Validation——Java EE 6的一個核心特性,它為實體驗證定義了一個中繼資料模型和API。其預設的中繼資料源是注解,但開發者可以通過XML描述符對其進行擴充。

Bean Validation是Java EE 6資料驗證新架構,Validation API并不依賴特定的應用層或是程式設計模型,這樣同一套驗證可由應用的所有層共享。它還提供了通過擴充Validation API來增加客戶化驗證限制的機制以及查詢限制中繼資料倉庫的手段。

在Java EE 6的Bean Validation出現之前,開發者不得不在表示層架構、業務層以及持久層中編寫驗證規則以保證這些規則的同步性,但這麼做非常浪費時間而且極易出錯。 Bean Validation是通過限制實作的,這些限制以注解的形式出現,注解可以放在JavaBean(如backing bean)的屬性、方法或是類上面。限制既可以是内建的注解(位于javax.validation.constraints包下面),也可以由使用者定 義。一些常用的内建注解列舉如下:

◆Min:被@Min所注解的元素必須是個數字,其值要大于或等于給定的最小值。

◆Max:被@Max所注解的元素必須是個數字,其值要小于或等于給定的最大值。

◆Size:@Size表示被注解的元素必須位于給定的最小值和最大值之間。支援Size驗證的資料類型有String、Collection(計算集合的大小)、Map以及數組。

◆NotNull:@NotNull確定被注解的元素不能為null。

◆Null:@Null確定被注解的元素一定為null。

◆Pattern:@Pattern確定被注解的元素(String)一定會比對給定的Java正規表達式。

代碼中通過Bean Validation注解聲明了一些限制:

  1. public class Address {  
  2.        @NotNull @Size(max=30)  
  3.        private String addressline1;  
  4.        @Size(max=30)  
  5.        private String addressline2;  
  6.        public String getAddressline1() {  
  7.           return addressline1;  
  8.        }  
  9.        public void setAddressline1(String addressline1) {  
  10.           this.addressline1 = addressline1;  
  11.        }  
  12.    } 

@NotNull指定被注解的元素addressline1不能為null;@Size指定被注解的元素addressline1和addressline2不能超過給定的最大值,即30個字元。

在驗證Address對象時,addressline1的值被傳遞到針對@NotNull限制的驗證類以及針對@Size限制的驗證類中,而 addressline2的值被傳遞到針對@Size限制的驗證類中,由相關的驗證類進行驗證。如下代碼自定義了一個名為ZipCode的限制:

  1. @Size(min=5, max=5)  
  2.    @ConstraintValidator(ZipcodeValidator.class)  
  3.    @Documented  
  4.    @Target({ANNOTATION_TYPE, METHOD, FIELD})  
  5.    @Retention(RUNTIME)  
  6.    public @interface ZipCode {  
  7.        String message() default "Wrong zipcode";  
  8.        String[] groups() default {};  
  9.    } 

可以将@ZipCode用在類、屬性或是方法上,就像其他限制一樣。

  1. public class Address {  
  2.        @ZipCode  
  3.        private String zipCode;  
  4.        public String getZipCode() {  
  5.           return zipCode;  
  6.        }  
  7.        public void setZipCode(String zipCode) {  
  8.           this.zipCode = zipCode;  
  9.        }  
  10.    } 

Validation API

開發者可以借助于Validation API以程式設計的方式驗證JavaBean。Bean Validation API的預設包是javax.validation。下面對該包中的一些類進行說明:

ConstraintValidator:這是一個接口,具體的限制驗證類需要實作該接口。該接口定義了相關的邏輯以驗證給定對象類型中的限制。

Validator:Validahttp://java.sun.com/javaee/6/docs/api/index.html?javax/validation/Validator.htmltor接口持有對象驗證圖的契約。該接口的實作必須是線程安全的。

ConstraintViolation:ConstraintViolation接口表示給定bean上的限制驗證失敗,它公開了限制違背上下文以及描述該違背情況的資訊。

ValidationException:如果在驗證過程中出現了某些不可恢複的錯誤就會抛出ValidationException異常。某些情況下可以指定該異常,如不合法的分組(group)定義、不合法的限制定義以及不合法的限制聲明等等。

限制中繼資料請求API

Bean Validation規範提供了查詢限制倉庫的手段。該API主要用于工具支援和與其他架構、庫以及JSR的內建。Bean Validation規範旨在為對象限制提供一個驗證引擎和中繼資料倉庫。需要進行限制定義、驗證和中繼資料的架構(Java EE或Java SE)可以利用Bean Validation規範完成這些功能,從應用或是基礎設施的角度來看,這麼做可以避免不必要的重複工作。

Bean Validation已經內建到了JSF 2.0和JPA 2.0中。在JSF中可以将表單輸入域與域對象的屬性綁定起來。JSF 2和Bean Validation可以判斷出綁定的是哪個屬性并執行與之相關的驗證,還會将限制違背的資訊顯示給使用者。Hibernate Validator 4是Bean Validation規範的參考實作架構,其最新版增加了不少新特性,如分組驗證、與JPA 2和JSF 2的自然內建以及擴充的注解集等等。