Java EE6 核心特征:Bean Validation 解析

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 代码
  1. public class Address{
  2. @NotNull @Size (max= 30 )
  3. private Stringaddressline1;
  4. @Size (max= 30 )
  5. private Stringaddressline2;
  6. public StringgetAddressline1(){
  7. return addressline1;
  8. }
  9. public void setAddressline1(Stringaddressline1){
  10. this .addressline1=addressline1;
  11. }
  12. }
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 代码
  1. @Size (min= 5 ,max= 5 )
  2. @ConstraintValidator (ZipcodeValidator. class )
  3. @Documented
  4. @Target ({ANNOTATION_TYPE,METHOD,FIELD})
  5. @Retention (RUNTIME)
  6. public @interface ZipCode{
  7. Stringmessage()default "Wrongzipcode" ;
  8. String[]groups()default {};
  9. }
@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 代码
  1. public class Address{
  2. @ZipCode
  3. private StringzipCode;
  4. public StringgetZipCode(){
  5. return zipCode;
  6. }
  7. public void setZipCode(StringzipCode){
  8. this .zipCode=zipCode;
  9. }
  10. }
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值