- 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注解聲明了一些限制:
- public class Address {
- @NotNull @Size(max=30)
- private String addressline1;
- @Size(max=30)
- private String addressline2;
- public String getAddressline1() {
- return addressline1;
- }
- public void setAddressline1(String addressline1) {
- this.addressline1 = addressline1;
- }
- }
@NotNull指定被注解的元素addressline1不能為null;@Size指定被注解的元素addressline1和addressline2不能超過給定的最大值,即30個字元。
在驗證Address對象時,addressline1的值被傳遞到針對@NotNull限制的驗證類以及針對@Size限制的驗證類中,而 addressline2的值被傳遞到針對@Size限制的驗證類中,由相關的驗證類進行驗證。如下代碼自定義了一個名為ZipCode的限制:
- @Size(min=5, max=5)
- @ConstraintValidator(ZipcodeValidator.class)
- @Documented
- @Target({ANNOTATION_TYPE, METHOD, FIELD})
- @Retention(RUNTIME)
- public @interface ZipCode {
- String message() default "Wrong zipcode";
- String[] groups() default {};
- }
可以将@ZipCode用在類、屬性或是方法上,就像其他限制一樣。
- public class Address {
- @ZipCode
- private String zipCode;
- public String getZipCode() {
- return zipCode;
- }
- public void setZipCode(String zipCode) {
- this.zipCode = zipCode;
- }
- }
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的自然內建以及擴充的注解集等等。