Java EE 6核心特征:Bean Validation解析
Bean Validation是Java EE 6數(shù)據(jù)驗(yàn)證新框架,Validation API并不依賴特定的應(yīng)用層或是編程模型,這樣同一套驗(yàn)證可由應(yīng)用的所有層共享。它還提供了通過(guò)擴(kuò)展Validation API來(lái)增加客戶化驗(yàn)證約束的機(jī)制以及查詢約束元數(shù)據(jù)倉(cāng)庫(kù)的手段。
在Java EE 6的Bean Validation出現(xiàn)之前,開發(fā)者不得不在表示層框架、業(yè)務(wù)層以及持久層中編寫驗(yàn)證規(guī)則以保證這些規(guī)則的同步性,但這么做非常浪費(fèi)時(shí)間而且極易出錯(cuò)。Bean Validation是通過(guò)約束實(shí)現(xiàn)的,這些約束以注解的形式出現(xiàn),注解可以放在JavaBean(如backing bean)的屬性、方法或是類上面。約束既可以是內(nèi)建的注解(位于javax.validation.constraints包下面),也可以由用戶定義。一些常用的內(nèi)建注解列舉如下:
◆Min:被@Min所注解的元素必須是個(gè)數(shù)字,其值要大于或等于給定的最小值。
◆Max:被@Max所注解的元素必須是個(gè)數(shù)字,其值要小于或等于給定的最大值。
◆Size:@Size表示被注解的元素必須位于給定的最小值和最大值之間。支持Size驗(yàn)證的數(shù)據(jù)類型有String、Collection(計(jì)算集合的大?。?、Map以及數(shù)組。
◆NotNull:@NotNull確保被注解的元素不能為null。
◆Null:@Null確保被注解的元素一定為null。
◆Pattern:@Pattern確保被注解的元素(String)一定會(huì)匹配給定的Java正則表達(dá)式。
代碼中通過(guò)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不能超過(guò)給定的最大值,即30個(gè)字符。
在驗(yàn)證Address對(duì)象時(shí),addressline1的值被傳遞到針對(duì)@NotNull約束的驗(yàn)證類以及針對(duì)@Size約束的驗(yàn)證類中,而addressline2的值被傳遞到針對(duì)@Size約束的驗(yàn)證類中,由相關(guān)的驗(yàn)證類進(jìn)行驗(yàn)證。如下代碼自定義了一個(gè)名為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
開發(fā)者可以借助于Validation API以編程的方式驗(yàn)證JavaBean。Bean Validation API的默認(rèn)包是javax.validation。下面對(duì)該包中的一些類進(jìn)行說(shuō)明:
ConstraintValidator:這是一個(gè)接口,具體的約束驗(yàn)證類需要實(shí)現(xiàn)該接口。該接口定義了相關(guān)的邏輯以驗(yàn)證給定對(duì)象類型中的約束。
Validator:Validahttp://java.sun.com/javaee/6/docs/api/index.html?javax/validation/Validator.htmltor接口持有對(duì)象驗(yàn)證圖的契約。該接口的實(shí)現(xiàn)必須是線程安全的。
ConstraintViolation:ConstraintViolation接口表示給定bean上的約束驗(yàn)證失敗,它公開了約束違背上下文以及描述該違背情況的信息。
ValidationException:如果在驗(yàn)證過(guò)程中出現(xiàn)了某些不可恢復(fù)的錯(cuò)誤就會(huì)拋出ValidationException異常。某些情況下可以指定該異常,如不合法的分組(group)定義、不合法的約束定義以及不合法的約束聲明等等。
約束元數(shù)據(jù)請(qǐng)求API
Bean Validation規(guī)范提供了查詢約束倉(cāng)庫(kù)的手段。該API主要用于工具支持和與其他框架、庫(kù)以及JSR的集成。Bean Validation規(guī)范旨在為對(duì)象約束提供一個(gè)驗(yàn)證引擎和元數(shù)據(jù)倉(cāng)庫(kù)。需要進(jìn)行約束定義、驗(yàn)證和元數(shù)據(jù)的框架(Java EE或Java SE)可以利用Bean Validation規(guī)范完成這些功能,從應(yīng)用或是基礎(chǔ)設(shè)施的角度來(lái)看,這么做可以避免不必要的重復(fù)工作。
Bean Validation已經(jīng)集成到了JSF 2.0和JPA 2.0中。在JSF中可以將表單輸入域與域?qū)ο蟮膶傩越壎ㄆ饋?lái)。JSF 2和Bean Validation可以判斷出綁定的是哪個(gè)屬性并執(zhí)行與之相關(guān)的驗(yàn)證,還會(huì)將約束違背的信息顯示給用戶。Hibernate Validator 4是Bean Validation規(guī)范的參考實(shí)現(xiàn)框架,其最新版增加了不少新特性,如分組驗(yàn)證、與JPA 2和JSF 2的自然集成以及擴(kuò)展的注解集等等。
【編輯推薦】