阅读更多

20顶
1踩

编程语言
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注解声明了一些约束:
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的约束:
@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 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的自然集成以及扩展的注解集等等。
20
1
评论 共 20 条 请登录后发表评论
20 楼 star022 2010-04-18 21:57
rainv 写道
加个验证过滤层不行?要注解干嘛。。
请求-独立验证层-action..


这样设计是不合适的,
这些数据验证一般都是些简单的验证,如数据长度,是否为null之类的,
完全没有业务逻辑的,
从高内聚的角度看,这些基本验证放在实体模型层合适。
19 楼 shinezhou 2010-03-25 23:22
不错~
18 楼 lkf520java 2010-03-25 19:42
我想知道如果数据不符合验证规则,错误信息会以什么方式提示出来?
还想问的是,这个是服务器端验证还是客户端验证?
17 楼 passnet 2010-03-25 16:40
seam中早已经借助hibernate实现了相应的机制
16 楼 mercyblitz 2010-03-24 15:17
这个东西,自己实现了
15 楼 yidao620c 2010-03-24 15:04
star022 写道
3年前,差点冲动自己搞出这么一套自定义注解~~

其实你本应该冲动一把的。
14 楼 zcq100 2010-03-24 13:31
注解还是相当实用的,在很多的地方能简化开发。
13 楼 protel.robin 2010-03-24 09:58
和使用xml解析各有优点,看使用习惯吧!
12 楼 treblesoftware 2010-03-24 09:45
有了这个功能好多了,免得去写那恶心的size()<30等等这些东西。数据归根到底还是给数据自己进行验证,设计的不错。
11 楼 Diego玄霄 2010-03-24 09:34
是个不错的想法, 但问题是,不符合验证的数据, JVM会怎么处理? 抛异常?
10 楼 workfish 2010-03-24 09:23
不喜欢这样的思路,一堆注解感觉好乱,而且缺乏逻辑性,对程序员的要求太高了,而且所谓的提示还是需要自己的重新定制的,没办法直接使用,还不如添加一个类似于验证代理框架
9 楼 rainv 2010-03-23 18:03
加个验证过滤层不行?要注解干嘛。。
请求-独立验证层-action..
8 楼 star022 2010-03-23 15:08
3年前,差点冲动自己搞出这么一套自定义注解~~
7 楼 xieyongwei 2010-03-23 15:05
这个是很好的发展
可惜来的有点迟了
还有JavaEE6成为业界通用平台也还需要时间
6 楼 sosyi 2010-03-23 14:49
怎么像 JPA??
5 楼 niyong 2010-03-23 12:35
晕,重复劳动
4 楼 zhu_chen001 2010-03-23 10:02
注解太多了不是好事情
3 楼 毕竟红尘 2010-03-23 10:00
这种思路看起来不错...
2 楼 mdream 2010-03-23 09:56
以前用过hibernate Validator的,感觉一般。不知道Bean Validation会有多少优越感。
1 楼 aofeng 2010-03-23 09:14
这样以后的校验代码是完全独立的,不需要每个方法中加一小段代码完成校验,一个注解或几个注解搞定。代码看起来更舒服。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • JavaEE6 Bean Validation提供了实体验证元数据模型与API

    作者Srini Penchikala于2010年3越2日发表《Java EE 6 Bean Validation Provides Entity Validation Metadata Model and API》

  • 高并发下金融账号控制案例

    目录 什么是高并发,高并发下为什么会有数据一致性的问题 基于资金账号体系数据库设计及开发相关的代码,测试发现问题 解决方案有哪些,不同数据一致性解决方案的特点比较,不同应用场景使用不同解决方案 总结不同的解决方案对应不同的业务场景 详解 什么是高并发,高并发下会出现什么问题,如何确保数据一致性 例子:往缸里面倒水,一个人一瓢,如果成千上百的就是并发。这个时候有一个人计数,如果所有人同时向缸里面倒水...

  • 数据库能力测试:SQL 语句改错

    本练习采用 MS Sql Server 作为数据库管理系统。 测试目标: 1.熟练掌握建表的 SQL 语句 2.熟练掌握查询的 SQL 语句 3.熟练掌握增加记录、修改记录、删除记录的 SQL 语句 4.熟练掌握创建视图的 SQL 语句 这些语句都存在各种各样的问题,有些是语法错误,有些是结果不符合题目的要求。个别题目是无法实现的,请指出无法实现的原因。 数据库资源请在这里下载:https://download.csdn.net/download/weixin_43941364/12475108 导

  • 数据库测试(三)

    数据库测试

  • Java EE 6核心特征:Bean Validation特性概述

    Java EE 6 提出了 Bean Validation 规范,使用注解的方式对 Java Bean 进行约束验证,不局限于某一层次或者某一编程模型,灵活易用。下边将向您系统的介绍该规范的各种特性。 概述 Bean Validation ...

  • java ee 6权威指南_Java EE 6权威指南-(第4版)-基础篇

    **部分 简介第1章 综述1.1 Java EE 6平台新特性1.2 Java EE应用模型1.3 分布式多层应用1.3.1 安全1.3.2 Java EE组件1.3.3 Java EE客户端1.3.4 Web 组件1.3.5 业务组件1.3.6 企业信息系统层1.4 Java EE容器1.4.1 容器...

  • Bean Validation

    Bean Validation简介 Bean Validation的特点 Bean Validation的配置 Bean Validation的用法 最简单的用法 自定义错误提示信息 在方法上面添加注解 资源链接 Bean Validation 官网地址: Bean Validation...

  • Java EE6 核心特征:Bean Validation 解析

    6的一个核心特性,它为实体验证定义了一个元数据模型和API。其默认的元数据源是注解,但开发者可以通过XML描述符对其进行扩展。 Validation API并不依赖特定的应用层或是编程模型,这样同一套验证可由应用的所有层...

  • Bean Validation 技术规范特性概述

    原文出处:...Bean 是 Java Bean 的缩写,在 Java 分层架构的实际应用中,从表示层到持久化层,每一层都需要对 Java Bean 进行业务符合性验证,如图 1 所示。然而对于同一个 Java B

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

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

  • Bean Validation 规范

    Bean 是 Java Bean 的缩写,在 Java 分层架构的实际应用中,从表示层到持久化层,每一层都需要对 Java Bean 进行业务符合性验证,如图 1 所示。然而对于同一个 Java Bean 的对象,在每一层都需要实现同样的验证逻辑...

  • JAVA EE 7 SDK Tutorial分析

    在Java EE 7平台的目的是向开发人员提供了一套强大的API,同时缩短开发时间,降低了应用的复杂性,并提高应用程序的性能。在Java EE 7平台引入了一个简化的编程模型。随着Java EE 7的技术,XML部署描述符现在是可选...

  • Bean Validation 规范内嵌的约束注解

    JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation。 在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情。应用程序必须通过某种手段来确保输入进来的数据从语义上来讲...

  • Java Web学习总结(41)——Java EE 8 新功能展望

    Java EE 7简介Java EE 作为一个企业应用的部署平台,具有很好的健壮性、能够提供强大的 Web 服务且非常易于部署。这些年来,通过其不断发展,它已大大简化了以服务器为中心的应用程序的开发、部署和管理,已经逐渐...

  • bean validation 技术规范

    Bean Validation 技术规范特性概述 张 冠楠 和 陈 志娴2011 年 3 月 24 日发布 WeiboGoogle+用电子邮件发送本页面 2 概述 Bean Validation 规范 Bean ...

  • Java EE 6权威指南:第4版.基础篇

    基础篇(Oracle Java EE 6文档团队成员精准解说Java EE 6平台)》基本信息原书名:The Java EE 6 Tutorial: Basic Concepts, Fourth Edition作者: (美)詹兆科(Jendrock,E.) [作译者介绍]译者: 韩智译丛书名: 图灵...

  • 数据库能力测试I(题目源自于CSDN论坛)

    [DB基础](10)选答题, 从下列题目中任选题分值满10分的作答. SYBASE A.(5)软件公司的张工在备份数据库除了备份应用数据库本身以外, 还备份master数据库,为什么? B.(5)SYBASE的VIEW创建有那些限制? ORACLEA.(5)解释归档和非归档模式之间的不同和它们各自的优缺点 B.(5) 兩個結果集互加及互減的函數 综合

  • 数据库设计的一些构想(从需求到数据库设计)

    数据库设计的一些构想(从需求到数据库设计)做过一些项目,总结了与数据库设计相关的资料,现做为图片方式上传,希望对数据库设计爱好者有些帮助. 如果大家对此有兴趣,可与我联系bigmouthz@163.net. 本想不多说的,没想到呵呵CSDN不允许少字符数的文章上传. 因此在本文后贴上一些文字请大家原谅.如图: ------------------------------------

  • 数据库能力测试II(源自于CSDN论坛)

      A. (10)抢号的处理在联机处理数据库中常常会遇到多个客户抢号的现象,但这些在OLTP中常常又是无法避免的,试问你有什么好的解决方案. (由于考虑到编码的前缀以及流水号的限制,所以具体情况不能用自增列实现). 提示:可以用图形, 建表, 编码等各种书面方式描述你的处理方案 [数据库案例](30)B (20)客户ABC分析给出现有客户排名销售表t1,及表

Global site tag (gtag.js) - Google Analytics