`
liyuandong
  • 浏览: 332087 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate Validation

    博客分类:
  • JAVA
 
阅读更多

Hibernate Validation 用法

 

Hibernate 验证器文档 

 

 

前言: 

 

 

Annotations 是为域对象指定一个不变约束的便利而优雅的途径.例如通过它,你可以表示一个属性不应该是Null值,账户余额绝对不能是负值,等等。这些域模型的约束通过注释它的属性声明在bean自身。验证器可以读取这些注释并检查约束违反性。验证机制可以在没有重复这些规则的情况下在应用程序的不同层里执行(表示层,数据访问层).Hibernate验证器在遵循DRY规则的情况下设计. 

 

 

Hibernate 验证器工作在两个级别。首先,它能检测位于内存的类实例的约束违反性.其次,它可以把约束应用在hibernate的元模型中并且把它们应用在生成的数据库中. 

 

 

每一个约束注释都与一个为检查实体实例而实现的验证器对应关联。一个验证器也可以可选的应用约束到hibernate元模型,允许hibernate生成DDL来表达这些约束。利用合适的事件监听器,你可以通过hibernate在插入或更新的时候检查约束性。Hibernate验证器没有限定在必须配合hibernate执行验证。你也可以容易的把它用在其他java的持久化提供者上面(实现了实体监听器). 

 

 

在运行期检查实例时,hibernate验证器把有关违反验证的信息放在一个InvalidValue类型的数组里返回.在其他信息中,InvalidValue所包含的错误描述消息可以嵌入参数值和注释绑定,并且消息字符串可以以资源文件的形式提供. 

 

 

第一章 定义约束 

 

 

1.1 什么是约束 

 

 

约束是一个给定的元素(可以使field,property,或bean)所必须遵循的规则.规则的语义可以由注释表达。约束通常有一些属性用来参数化约束限制。这些约束应用到被注释的元素。 

 

 

1.2 内建约束 

 

 

与Hibernate 验证器一起内建了一些约束,他们已经覆盖了大多数基本的数据检查,当然我们后来会看到,你不一定使用它们,你可以在一分钟内写出你自己的约束。 

 

 

表 1.1. 内建约束 

 

 

注释 

 

用于 

 

运行时检查 

 

Hibernate Metadata 兼容 

 

 

@Length(min=, max=) 

 

property (字符串) 

 

检查是字符串长度范围 

 

列长度被设置到最大 

 

 

@Max(value=) 

 

property (数字,或代表数字的字符串) 

 

检查值是否=或<max 

 

在列上添加一个约束 

 

 

@Min(value=) 

 

property (数字,或代表数字的字符串) 

 

检查值是否=或>min 

 

在列上添加一个约束 

 

 

@NotNull 

 

property 

 

是否null 

 

列不为null 

 

 

@NotEmpty 

 

property 

 

字符串不空或非NULl 

 

 

链接不空或非null 

 

对字符列非null约束 

 

 

@Past 

 

property (date 或 calendar) 

 

检查是否日期在过去 

 

在列上添加一个约束 

 

 

@Future 

 

property (date 或 calendar) 

 

检查是否日期在将来 

 

无 

 

 

@Pattern(regex="regexp", flag=) or @Patterns( {@Pattern(...)} ) 

 

property (字符串) 

 

检查是否属性匹配规则表达式给定的匹配标志 (see java.util.regex.Pattern ) 

 

无 

 

 

@Range(min=, max=) 

 

property (数字,或代表数字的字符串) 

 

是否值min<=value<=max 

 

在列上添加一个约束 

 

 

@Size(min=, max=) 

 

property (数组, 集合, map) 

 

Min<=Size<=max 

 

无 

 

 

@AssertFalse 

 

property 

 

检查方法计算到false (多用在代码里检查约束) 

 

无 

 

 

@AssertTrue 

 

property 

 

检查方法计算到true (多用在代码里检查约束) 

 

none 

 

 

@Valid 

 

property (对象) 

 

在一个关联对象上递归的执行检验.如果对象是一个数组或者集合,对象将被递归的检验. 如果对象是一个map,元素将被递归的验证. 

 

none 

 

 

@Email 

 

property (String) 

 

检查是否字符创符合email规范 

 

none 

 

 

@CreditCardNumber 

 

property (String) 

 

字符串是否一个格式好的信誉卡号码(derivative of the Luhn algorithm) 

 

none 

 

 

@Digits 

 

property (数字,或代表数字的字符串) 

 

数字是否符合整数部分和小数部分的精度 

 

定义列精度和范围 

 

 

@EAN 

 

property (字符串) 

 

字符是否是格式化的 EAN 或者 UPC-A 编码 

 

none 

 

 

@Digits 

 

property (numeric or string representation of a numeric) 

 

check whether the property is a number having up to integerDigits integer digits and fractionalDigits fractonal digits 

 

define column precision and scale 

 

 

 

 

 

1.3.错误消息 

 

 

 

 

随Hibernate 验证器一起的有一个被翻译成十种语言的默认错误消息(如果没有你所在地区的语言,请发送给我们一个补丁)你可以通过创建一个ValidatorMessages.properties( ValidatorMessages_loc.properties )文件覆盖这些消息,甚至当你在写你的验证器注释的时候你可以添加你自己的消息集合。如果hibernate验证器在你的资源文件里或者ValidatorMessage里不能找到一个key的对应值,那么他将返回默认的内建值。 

 

 

 

 

作为选择,当你程序化在一个bean上检查验证规则或者你要一个完全不同的修改机制时你可以提供一个资源绑定,你可以提供一个org.hibernate.validator.MessageInterpolator接口的实现。 

 

 

 

 

1.4. 定义你的约束 

 

 

 

 

扩展内建的约束集合非常容易,任何约束有两个固定的部分:约束描述器(注释) 

 

 

 

 

和约束验证器(实现的类)下面是一个简单的用户定义的描述器, 

 

 

 

 

@ValidatorClass(CapitalizedValidator.class) 

 

@Target(METHOD) 

 

@Retention(RUNTIME) 

 

@Documented 

 

public @interface Capitalized { 

 

    CapitalizeType type() default Capitalize.FIRST; 

 

    String message() default "has incorrect capitalization" 

 

}        

 

Type 是一个描述属性如何被使用的参数,这是一个用户的参数完全依赖注释业务 

 

 

 

 

Message用来描述约束违反强制性的默认字符串,你可以硬编码或者部分或者全部利用资源绑定机制。参数值将被注入消息里面当{parameter}字符串被找到(在我们的例子Capitalization is not {type} 将产生 Capitalization is not FIRST )把所有字符串都放在属性文件ValidatorMessages.properties是个好的实践. 

 

 

 

 

@ValidatorClass(CapitalizedValidator.class) 

 

@Target(METHOD) 

 

@Retention(RUNTIME) 

 

@Documented 

 

public @interface Capitalized { 

 

    CapitalizeType type() default Capitalize.FIRST; 

 

    String message() default "{validator.capitalized}"; 

 

 

 

 

 

 

#in ValidatorMessages.properties 

 

validator.capitalized = Capitalization is not {type} 

 

 

 

然后你可以看见{}符号是递归的 

 

 

 

 

为了链接一个描述器到他的验证器实现我们用@ValidatorClass元注释验证器类必须命名一个实现了Validator<ConstraintAnnotation>的类。 

 

 

 

 

public class CapitalizedValidator 

 

        implements Validator<Capitalized>, PropertyConstraint { 

 

    private CapitalizeType type; 

 

 

 

    //part of the Validator<Annotation> contract, 

 

    //allows to get and use the annotation values 

 

    public void initialize(Capitalized parameters) { 

 

        type = parameters.type(); 

 

    } 

 

 

 

    //part of the property constraint contract 

 

    public boolean isValid(Object value) { 

 

        if (value==null) return true; 

 

        if ( !(value instanceof String) ) return false; 

 

        String string = (String) value; 

 

        if (type == CapitalizeType.ALL) { 

 

            return string.equals( string.toUpperCase() ); 

 

        } 

 

        else { 

 

            String first = string.substring(0,1); 

 

            return first.equals( first.toUpperCase(); 

 

        } 

 

    } 

 

}        

 

isValid()方法应该返回false如果约束已经被违反,更多的例子请参考内建验证器实现. 

 

 

 

 

我们明白属性级别的验证,但是你可以写一个bean级别的验证注释。替代于接受返回的实例属性,bean自身将被传进验证器。为了激活验证检查,仅仅替代的注释bean自身。在单元测试里有一个小的例子。 

 

 

 

 

如果你的约束可以在一些属性或者类型上被应用多次(用不同的参数)你可以用下面的注释形式 

 

 

 

 

@Target(METHOD) 

 

@Retention(RUNTIME) 

 

@Documented 

 

public @interface Patterns { 

 

    Pattern[] value(); 

 

 

 

 

@Target(METHOD) 

 

@Retention(RUNTIME) 

 

@Documented 

 

@ValidatorClass(PatternValidator.class) 

 

public @interface Pattern { 

 

    String regexp(); 

 

 

基本上,注释以一个验证器注释数组的形式包含值属性 

 

 

 

 

1.5 注释域模型 

 

 

 

 

由于你现在已经熟悉了注释,下面语法应该是非常熟悉的 

 

 

 

 

public class Address { 

 

    private String line1; 

 

    private String line2; 

 

    private String zip; 

 

    private String state; 

 

    private String country; 

 

    private long id; 

 

 

 

    // a not null string of 20 characters maximum 

 

    @Length(max=20) 

 

    @NotNull 

 

    public String getCountry() { 

 

        return country; 

 

    } 

 

 

 

    // a non null string 

 

    @NotNull 

 

    public String getLine1() { 

 

        return line1; 

 

 

 

 

    //no constraint 

 

    public String getLine2() { 

 

        return line2; 

 

    } 

 

 

 

    // a not null string of 3 characters maximum 

 

    @Length(max=3) @NotNull 

 

    public String getState() { 

 

        return state; 

 

    } 

 

 

 

    // a not null numeric string of 5 characters maximum 

 

    // if the string is longer, the message will 

 

    //be searched in the resource bundle at key 'long' 

 

    @Length(max=5, message="{long}") 

 

    @Pattern(regex="[0-9]+") 

 

    @NotNull 

 

    public String getZip() { 

 

        return zip; 

 

    } 

 

 

 

    // should always be true 

 

    @AssertTrue 

 

    public boolean isValid() { 

 

        return true; 

 

    } 

 

 

 

    // a numeric between 1 and 2000 

 

    @Id @Min(1) 

 

    @Range(max=2000) 

 

    public long getId() { 

 

        return id; 

 

    } 

 

}        

 

然而这个例子仅仅演示了共用的属性验证,你也可以以可见的形式注释 

 

 

 

 

@MyBeanConstraint(max=45 

 

public class Dog { 

 

    @AssertTrue private boolean isMale; 

 

    @NotNull protected String getName() { ... }; 

 

... 

 

 

       也可以注释接口,hibernate验证器将检查所有实现此接口的子类或子接口通过一个给定的bean来读取合适的验证注释。 

 

 

 

 

public interface Named { 

 

    @NotNull String getName(); 

 

    ... 

 

 

 

 

public class Dog implements Named { 

 

 

 

    @AssertTrue private boolean isMale; 

 

 

 

    public String getName() { ... }; 

 

 

 

 

 

 

Dog类的Name属性将被检查null约束 

分享到:
评论

相关推荐

    Hibernate Validation使用示例及讲解

    **Hibernate Validation 深度解析与实践指南** Hibernate Validation 是一个强大的 Java Bean 验证框架,它是 JSR-303(Java Bean Validation)规范的实现,后来在 JSR-349 中进行了扩展,增加了更多的验证注解和...

    springmvc4与hibernate validation校验器完全兼容jar包

    而Hibernate Validation则是Java世界中用于数据验证的主流库,它基于JSR 303和JSR 349标准,提供了丰富的验证规则和易于使用的API。在Spring MVC中集成Hibernate Validation,可以实现对输入数据的有效性检查,从而...

    resin 支持spring mvc 5.0以上版本 支持Hibernate validation

    本文将深入探讨Resin如何支持Spring MVC 5.0及以上版本,以及它对Hibernate Validation的支持。 首先,Spring MVC 5.0引入了许多改进和新特性,例如对Java 8的全面支持、更好的类型安全的模型绑定、增强的路径变量...

    Hibernate Validation各注解的用法

    标题“Hibernate Validation各注解的用法”表明了本文将深入探讨Hibernate Validation框架中使用的各种注解及其应用场景。Hibernate Validation是Java世界中一个强大的数据验证库,它提供了对对象模型的验证规则,...

    Hibernate Validation自定义注解校验的实现

    Hibernate Validation自定义注解校验的实现 Hibernate Validation自定义注解校验的实现是指在Hibernate Validation框架中,使用自定义的注解来实现特定的校验逻辑。在本文中,我们将通过示例代码,详细地介绍如何...

    Hibernate Bean Validation jar包

    Bean Validation 规范对 Java Bean 的验证流程如下:在实际使用中调用 Validator.validate(JavaBeanInstance) 方法后,Bean Validation 会查找在 JavaBeanInstance上所有的约束声明,对每一个约束调用对应的约束验证...

    springMVC整合hibernate的校验Validation

    这主要是通过使用Hibernate Validator来实现数据的验证,它是一个遵循JSR 303(Java Bean Validation)和JSR 349(Java Bean Validation 1.1)标准的实现。本教程将详细介绍如何在Spring MVC中配置并使用Hibernate ...

    如何自定义hibernate validation注解示例代码

    Hibernate Validator 是 Bean Validation 的参考实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,下面这篇文章主要给大家介绍了关于如何自定义hibernate validation注解的相关资料,...

    springmvc校验器validation的所有配套jar包

    Hibernate Validation是Java Bean Validation规范的一个实现,这个规范定义了一种标准的方式来声明和执行对象级别的约束。它提供了一种声明式的验证方式,使得在代码中对数据进行验证变得更加简洁。以下是关于...

    JAVA中通过Hibernate-Validation进行参数验证

    JAVA中通过Hibernate-Validation进行参数验证 JAVA中通过Hibernate-Validation进行参数验证是JAVA服务器端代码开发中的一种常用技术。在开发JAVA服务器端代码时,我们会遇到对外部传来的参数合法性进行验证,而...

    hibernate-validator-5.0.0.CR2.zip

    里面含有hibernate-validator 进行校验的jar包,包括了基础hibernate-validator-5.0.0.CR2.jar hibernate-validator-annotation-processor-5.0.0.CR2.jar

    validation后端验证所需要jar包

    `validation`通常指的是Hibernate Validation框架,这是一个符合JSR 303和JSR 349标准的Java Bean验证实现。它允许开发者定义一组约束规则,并在运行时自动检查这些规则,如果违反规则,就会抛出异常。这个框架不仅...

    Apache Shiro+SpringMVC+Hibernate Search企业信息管理系统

    5、Hibernate Validation 5.0 6、Hibernate Search 4.2 (Apache Lucene 3.6) 7、SiteMesh 2.4 8、JQuery 1.9 9、Twitter Bootstrap 2.3.1 10、....其他技术就不讲了,具体参考项目 项目访问: 1)后台后台...

    数据验证jar包

    首先,`hibernate-validator-4.1.0.Final.jar`是Hibernate Validation的实现包,它是Java Bean Validation (JSR-303)规范的一个实现。Hibernate Validation提供了对对象属性的约束注解,例如`@NotNull`、`@Size`、`@...

    Validation3个jia包 validation-api,hibernate-validator

    在给定的标题和描述中提到了三个重要的JAR包:`validation-api`, `hibernate-validator`以及`jboss-logging`,它们在数据验证中扮演着不同的角色。 首先,`validation-api-1.0.0.GA.jar`是Java Bean Validation API...

    hibernate-validator-interface

    Hibernate Validator 是Java Bean Validation规范的一个实现,它为Java应用程序提供了强大的验证框架。在本文中,我们将深入探讨Hibernate Validator接口及其在Groovy语言中的应用。 1. Hibernate Validator简介 ...

    完整版 Java开发实训课程系列-SpringMVC框架技术教程 第5章 数据校验 (共26页).pptx

    1. 导入校验库:引入Hibernate Validation的jar包,它包含了校验功能所需的类和接口。 2. 配置校验器:在SpringMVC的配置文件中配置校验相关的bean,使Spring能够识别并使用校验器。 3. 注入校验器:将校验器注入到...

    基于java的病人挂号系统网站源码(可运行可用于毕业设计).zip

    Hibernate Validation 6.0 Alibaba Druid 1.1 4、视图层 Bootstrap 3.3 Thymeleaf 3.0 业务流程 1.进入系统登陆页面,医生或患者凭借账号和密码登录进入病人挂号管理平台 2.医生登陆成功后跳转到系统首页展示自己...

Global site tag (gtag.js) - Google Analytics