日期:2014-05-19  浏览次数:20612 次

Java EE6中的新框架 Bean的验证

转:http://xiangtui.iteye.com/blog/970951,

?

验证数据是应用程序生命周期中一个常见的任务,例如,在应用程序的表示层,你可能想验证用户在文本框中输入的字符数最多不超过20个,或者想验证用户在数字字段输入的字符只能是数字。
????????????????????????????????????????????????????????????????????????????????????
?????开发人员在应用程序的各层中通常使用相同的验证逻辑,或者将验证逻辑放在数据模型中。

?????Bean验证(JSR 303)使验证变得更简单了,减少了重复,错误和凌乱,Bean验证提供了一个标准的验证框架,在框架中相同的验证集可以在应用程序的所有层之间共享。

????Bean验证提供了一个框架验证遵循JavaBean规范编写的Java类,你可以使用 注解指定一个JavaBean上的约束,你可以注解一个JavaBean类、字段或属性,你也可以通过XML描述符扩展或覆盖这些约束,验证类验证每个约 束时,你要指定那个验证类用于给定的约束类型。

?


例如,下面是通过Bean验证注解声明一些约束
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绝不能为空,@Size注解指定注解元素addressline1和addressline2决不能大于指定的长度(30个字符)。

?????验证Address对象时,addressline1的值传递给为@NotNull约束定义的验证类,同时还要传递给为@Size约束定义的验证类,addressline2的值也要传递给为@Size约束定义的验证类。

??? @NotNull 和@Size约束内置于Bean验证框架中,因此你不需要为它们定义验证类,但你可以在内置约束上添加自己的约束,那时就需要定义自己的验证类了。例如, 你可以定义如下的@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 addressline3;

public String getZipCode(){
return zipCode;
}

public void setZipCode(String zipCode){
this.zipCode=zipCode;
}

Address对象验证时,addressline3的值传递给 ZipcodeValidator类进行验证,注意约束定义包括另一个约束:@Size(min=5, max=5),这意味着由@ZipCode注解注解的元素必须恰好是5个字符,除了执行ZipcodeValidator进行主要的约束检查外,需要再次 使用这个约束对元素进行验证。Bean验证允许你创建一个由其它约束组成的约束,还要注意约束定义了一个错误消息,如果验证检查约束失败就返回这个错误消 息,这里的错误消息是“Wrong zipcode”。

你也可以使用Bean验证验证一个完整的对象图(object graph),一个对象图是由其它对象组成的一个对象,如果你在对象图的根对象上指定@Valid注解,它会指引相关的验证器递归验证对象图中的关联对象,如:

public class Order{

?@OrderNumber private String orderNumber;
?@Valid @NotNull private Address delivery;
}

Order对象验证时,Address对象和对象图中关联的对象也被验证。