Bean Validation(JSR 303)——Java
EE
6的一個核心特性,它為實體驗證定義了一個中繼資料模型和API。其預設的中繼資料源是註解,但開發人員可以通過XML描述符對其進行擴充。
Validation API並不依賴特定的應用程式層或是編程模型,這樣同一套驗證可由應用的所有層共用。它還提供了通過擴充Validation
API來增加客戶化驗證約束的機制以及查詢約束中繼資料倉庫的手段。
在JEE6的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註解聲明了一些約束:
Java
代碼
- 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;
- }
- }
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的約束:
Java
代碼
- @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
{};
- }
@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用在類、屬性或是方法上,就像其他約束一樣。
Java
代碼
- public
class
Address {
- @ZipCode
- private
String zipCode;
-
- public
String getZipCode() {
- return
zipCode;
- }
-
- public
void
setZipCode(String zipCode) {
- this
.zipCode = 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的自然整合以及擴充的註解集等等。
轉自:http://www.javaeye.com/news/15265