Java EE 6核心特征:Bean Validation解析

开发 后端
Bean Validation——Java EE 6的一个核心特性,它为实体验证定义了一个元数据模型和API。其默认的元数据源是注解,但开发者可以通过XML描述符对其进行扩展。

Bean Validation是Java EE 6数据验证新框架,Validation API并不依赖特定的应用层或是编程模型,这样同一套验证可由应用的所有层共享。它还提供了通过扩展Validation API来增加客户化验证约束的机制以及查询约束元数据仓库的手段。

在Java EE 6的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注解声明了一些约束:

  1. public class Address {  
  2.        @NotNull @Size(max=30)  
  3.        private String addressline1;  
  4.  
  5.        @Size(max=30)  
  6.        private String addressline2;  
  7.  
  8.        public String getAddressline1() {  
  9.           return addressline1;  
  10.        }  
  11.  
  12.        public void setAddressline1(String addressline1) {  
  13.           this.addressline1 = addressline1;  
  14.        }  
  15.    } 

@NotNull指定被注解的元素addressline1不能为null;@Size指定被注解的元素addressline1和addressline2不能超过给定的最大值,即30个字符。

在验证Address对象时,addressline1的值被传递到针对@NotNull约束的验证类以及针对@Size约束的验证类中,而addressline2的值被传递到针对@Size约束的验证类中,由相关的验证类进行验证。如下代码自定义了一个名为ZipCode的约束:

  1. @Size(min=5max=5)  
  2.    @ConstraintValidator(ZipcodeValidator.class)  
  3.    @Documented  
  4.    @Target({ANNOTATION_TYPE, METHOD, FIELD})  
  5.    @Retention(RUNTIME)  
  6.    public @interface ZipCode {  
  7.        String message() default "Wrong zipcode";  
  8.        String[] groups() default {};  
  9.    } 

 可以将@ZipCode用在类、属性或是方法上,就像其他约束一样。

  1. public class Address {  
  2.        @ZipCode  
  3.        private String zipCode;  
  4.  
  5.        public String getZipCode() {  
  6.           return zipCode;  
  7.        }  
  8.  
  9.        public void setZipCode(String zipCode) {  
  10.           this.zipCode = zipCode;  
  11.        }  
  12.    } 

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的自然集成以及扩展的注解集等等。

【编辑推荐】

  1. Java EE 6简化开发总结:注解支持与Profile
  2. Java EE 6引入的JPA 2.0四大新特性详解
  3. Java EE 6新特性之Servlet 3.0的异步处理
  4. Java EE 6数据验证新框架:Bean验证
  5. 九大因素让Java EE 6成为你的省钱法宝
责任编辑:王晓东 来源: infoq
相关推荐

2011-04-02 14:33:51

Bean ValidaJava EE 6Java

2010-01-05 09:15:45

Java EE 6Bean验证

2013-07-11 09:29:24

J2EE7

2023-10-18 18:38:44

数据校验业务

2009-12-08 09:09:58

Java EE 6

2012-02-20 10:28:03

JBossJava

2011-08-12 08:40:39

PaaSOpenShiftJava EE 6

2021-10-08 06:50:32

版本历史代码

2010-07-01 15:31:08

Java EE 6EJBWebService

2009-12-15 09:13:07

Java EE 6

2009-10-26 10:05:51

NetBeans 6.

2009-06-23 16:48:26

J2EE常见问题J2EE平台

2010-01-26 09:10:38

Java EE 6注解Profile

2010-01-14 09:15:07

Java EE 6Servlet 3.0异步处理

2009-06-10 13:19:21

J2EE核心APIJ2EE核心组件

2009-06-22 17:05:41

Java EEJava企业应用

2019-01-08 16:26:43

Java EEJ2EEJakarta EE

2010-01-26 09:23:18

Java EE 6

2010-01-18 09:37:39

JSF 2.0Java EE 6

2009-12-03 08:55:12

Java EE 6
点赞
收藏

51CTO技术栈公众号