Java EE 6数据验证新框架:Bean验证

原创
开发 后端
Java EE 6有三大新技术,分别是JAX-RS特性、上下文和依赖注入、以及Bean验证。Bean验证用于验证数据,它提供了一个标准的验证框架,在框架中相同的验证集可以在应用程序的所有层之间共享。因此,Bean验证减少了重复和错误,简化了验证。

【51CTO精选译文】对于Sun最新发布的Java EE 6平台,过去51CTO已经陆续介绍了平台的主要目标,以及三大新技术中的JAX-RS以及上下文和依赖注入。本文介绍第三个技术:Bean验证。

验证数据是应用程序生命周期中一个常见的任务,例如,在应用程序的表示层,你可能想验证用户在文本框中输入的字符数最多不超过20个,或者想验证用户在数字字段输入的字符只能是数字。

开发人员在应用程序的各层中通常使用相同的验证逻辑,或者将验证逻辑放在数据模型中。

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

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

例如,下面是通过Bean验证注解声明一些约束的类的一部分代码:

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

@NotNull注解指定了注解元素addressline1绝不能为空,@Size注解指定注解元素addressline1和addressline2决不能大于指定的长度(30个字符)。

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

51CTO编辑推荐:Java EE 6平台指南

@NotNull 和@Size约束内置于Bean验证框架中,因此你不需要为它们定义验证类,但你可以在内置约束上添加自己的约束,那时就需要定义自己的验证类了。例如,你可以定义如下的@ZipCode约束:

  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.      String message() default "Wrong zipcode";  
  8.      String[] groups() default {};  
  9.  }  

然后你可以在类、字段或属性上象其它约束定义那样定义@ZipCode约束,如:

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

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

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

  1. public class Order {  
  2.        @OrderNumber private String orderNumber;  
  3.        @Valid @NotNull private Address delivery;  
  4.    }  
  5.  

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

为了满足在应用程序各层之间共享相同的验证集,Java EE 6平台整合了Bean验证。例如,表示层技术,如JSF,以及企业级技术,如JPA,都可以通过Bean验证框架访问约束定义和验证器,你不再需要在多个地方指定约束。

原文:Introducing the Java EE 6 Platform 作者:Ed Ort

责任编辑:yangsai 来源: 51CTO.com
相关推荐

2010-03-22 09:33:18

Bean Valida

2011-04-02 14:33:51

Bean ValidaJava EE 6Java

2009-06-25 15:37:12

Struts2教程Validation框

2014-06-09 09:19:10

2009-06-04 10:33:10

struts vali框架

2010-01-14 09:15:07

Java EE 6Servlet 3.0异步处理

2009-02-04 13:13:03

2009-12-11 11:33:09

NetBeans 6.

2022-02-17 13:04:57

网络验证运营商

2009-08-04 15:02:18

ASP.NET数据验证

2009-07-10 11:25:48

Swing应用数据验证

2009-07-23 09:42:44

EJB 3.1Java EE 6

2011-06-28 13:43:50

Java EE

2010-09-06 11:24:47

CHAP验证PPP身份验证

2015-03-17 09:28:04

2024-02-19 07:40:10

2011-03-30 09:03:57

struts2

2009-11-24 13:17:16

PHP安全验证数据

2019-11-21 09:00:00

数据验证EF Core

2009-06-05 09:58:20

struts2验证用户注册
点赞
收藏

51CTO技术栈公众号