Java EE 6 提出了 Bean Validation 規范,使用注解的方式對 Java Bean 進行約束驗證,不局限於某一層次或者某一編程模型,靈活易用。下邊將向您系統的介紹該規范的各種特性。
概述 Bean Validation 規范
Bean 是 Java Bean 的縮寫,在 Java 分層架構的實際應用中,從表示層到持久化層,每一層都需要對 Java Bean 進行業務符合性驗證,如圖 1 所示。然而對於同一個 Java Bean 的對象,在每一層都需要實現同樣的驗證邏輯時,這將是一項耗時且容易誘發錯誤的做法。Bean Validation 規范的目標就是避免多層驗證的重復性。事實上,開發者更傾向於將驗證規則直接放到 Java Bean 本身,使用注解的方式進行驗證規則的設計。
圖 1. Java 分層驗證結構示意圖
JSR303 規范(Bean Validation 規范)提供了對 Java EE 和 Java SE 中的 Java Bean 進行驗證的方式。該規范主要使用注解的方式來實現對 Java Bean 的驗證功能,並且這種方式會覆蓋使用 XML 形式的驗證描述符,從而使驗證邏輯從業務代碼中分離出來,如圖 2 所示。
圖 2. Java Bean 驗證模型示意圖
JSR303 規范提供的 API 是 Java Bean 對象模型的一般擴展,它並不局限於某一層或者某一編程模型,在服務器端和客戶端都可使用,其最大的特點就是易用而且靈活。
Hibernate Validator4.0 是 JSR303 規范的參考實現之一,本文所有示例代碼均使用該參考實現。
下面給出一個 Bean Validation 的簡單示例(清單 1):
清單 1:
- public class Employee {
- @NotNull(message = "The id of employee can not be null")
- private Integer id;
- @NotNull(message = "The name of employee can not be null")
- @Size(min = 1,max = 10,message="The size of employee's name must between 1 and 10")
- private String name;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public static void main(String[] args) {
- Employee employee = new Employee();
- employee.setName("Zhang Guan Nan");
- ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
- Validator validator = vf.getValidator();
- Set
> set = validator.validate(employee); - for (ConstraintViolation
constraintViolation : set) { - System.out.println(constraintViolation.getMessage());
- }
- }
- }
運行該示例的輸出結果為:
- The size of employee's name must between 1 and 10
- The id of employee can not be null
從示例中可以看出,Bean Validation 使用注解(@NotNull 和 @Size)的方式對字段 id 和 name 進行了約束聲明,當該 Java Bean 被實際使用時,相關的驗證器就會對該類的實例進行驗證確保其符合該約束聲明。完成 Java Bean 的驗證通常可分為如下四個步驟:
1. 約束注解的定義
2. 約束驗證規則(約束驗證器)
3. 約束注解的聲明
4. 約束驗證流程
本文第二大部分將詳細介紹約束注解的定義和約束驗證規則;第三大部分將詳細介紹約束注解的聲明和約束驗證流程;第四大部分將介紹 JSR303 規范提供的 API。