Hibernate Validator JSR303示例教程

欢迎使用Hibernate Validator示例教程。数据验证是任何应用程序的组成部分。您将使用Javascript在表示层找到数据验证。然后在服务器端代码处理客户端数据之前。在持久化之前也会进行数据验证,以确保它遵循正确的格式。

目录[ 隐藏 ]

  • 1 Hibernate Validator

    • 1.1 Hibernate Validator Maven依赖项
    • 1.2 Hibernate验证示例
    • 1.3 Hibernate Validator自定义错误消息
    • 1.4基于XML的约束验证
    • 1.5财产等级限制
    • 1.6带继承的Hibernate验证
    • 1.7使用@Valid注释使用Composition进行验证
    • 1.8方法参数Hibernate验证
    • 1.9 Hibernate Validator示例测试程序
    • 1.10 Hibernate Validator自定义验证和Spring Framework集成
    • 1.11休眠验证器摘要

Hibernate Validator

验证是一项交叉任务,因此我们应该尝试将其与业务逻辑区分开来。这就是为什么JSR303和JSR349提供了使用注释验证bean的规范。Hibernate Validator提供了这两个bean验证规范的参考实现。

使用Hibernate Validator非常简单,最好的部分是我们可以轻松扩展它并创建我们自己的自定义验证注释。今天我们将通过示例详细介绍hibernate验证器。最后,我们将有一个测试程序来检查验证。

我为所有hibernate验证示例创建了一个示例项目,下图显示了最终的项目结构。

Hibernate Validator Maven依赖项

我们需要添加JSR303和Hibernate Validator依赖项来使用它们。


<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>1.1.0.Final</version>
</dependency>
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.1.1.Final</version>
</dependency>

Hibernate Validator还需要实现统一表达式语言(JSR 341)来评估约束违规消息中的动态表达式。

如果您的应用程序在诸如JBoss之类的servlet容器中运行,则已经提供了它。但是如果您在我的示例项目之类的独立应用程序中使用它,则需要手动添加它们。必需的依赖项是;


<dependency><groupId>javax.el</groupId><artifactId>javax.el-api</artifactId><version>2.2.4</version>
</dependency>
<dependency><groupId>org.glassfish.web</groupId><artifactId>javax.el</artifactId><version>2.2.4</version>
</dependency>

检查图像中是否存在项目中的所有maven依赖项。现在我们已准备好开始使用hibernate验证示例。

Hibernate验证示例

让我们创建一个简单的类并为其添加一些验证。

Employee.java


package com.journaldev.validator.hibernate.model;import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;import org.hibernate.validator.constraints.CreditCardNumber;
import org.hibernate.validator.constraints.Email;public class Employee {@Min(value=1, groups=EmpIdCheck.class)private int id;@NotNull(message="Name cannot be null")@Size(min=5, max=30)private String name;@Emailprivate String email;@CreditCardNumberprivate String creditCardNumber;//default no-args constructorpublic Employee(){}public Employee(int id, String name, String email, String ccNum){this.id=id;this.name=name;this.email=email;this.creditCardNumber=ccNum;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getCreditCardNumber() {return creditCardNumber;}public void setCreditCardNumber(String creditCardNumber) {this.creditCardNumber = creditCardNumber;}}

我们应该避免使用特定于实现的注释来进行松散耦合。但是hibernate验证器提供了一些非常好的验证注释,例如@Email@CreditCardNumber

我们还可以提供自定义错误消息以用于任何验证。如果没有定义消息,则将使用hibernate内置错误消息。

我们可以将组分配给任何验证,这对于仅验证一组字段非常有用。例如,如果我只需要验证Employee id字段,我可以使用EmpIdCheckgroup。为此,我们需要定义一个类/接口。

EmpIdCheck.java


package com.journaldev.validator.hibernate.model;public interface EmpIdCheck {
}

我们稍后会在测试程序中查看它的用法。

Hibernate Validator自定义错误消息

我们也可以定义自定义错误消息,我们只需要ValidationMessages.properties在类路径中包含文件。

ValidationMessages.properties


#Hibernate Bug for @CreditCardNumber Workaround - https://hibernate.atlassian.net/browse/HV-881
org.hibernate.validator.constraints.LuhnCheck.message=The check digit for ${validatedValue} is invalid, Luhn Modulo 10 checksum failed.org.hibernate.validator.constraints.Email.message=Invalid email address

这些属性文件也支持本地化,在这种情况下我们需要保留文件名,如ValidationMessages_tr_TR.properties

消息的属性名称是完全分类的注释名称,末尾有消息,您可以从上面的示例中轻松搞清楚。

基于XML的约束验证

有时我们想要对第三方类进行验证,然后我们就不能对它们使用注释。在这种情况下,基于xml配置的验证非常方便。例如,假设我们有一个没有任何验证注释的类,如下所示。

EmployeeXMLValidation.java


package com.journaldev.validator.hibernate.model;public class EmployeeXMLValidation {private int id;private String name;private String email;private String creditCardNumber;//default no-args constructorpublic EmployeeXMLValidation(){}public EmployeeXMLValidation(int id, String name, String email, String ccNum){this.id=id;this.name=name;this.email=email;this.creditCardNumber=ccNum;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getCreditCardNumber() {return creditCardNumber;}public void setCreditCardNumber(String creditCardNumber) {this.creditCardNumber = creditCardNumber;}}

上面的bean hibernate验证的一个简单示例可能如下所示。

employeeXMLValidation.xml


<constraint-mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/mapping validation-mapping-1.1.xsd"xmlns="http://jboss.org/xml/ns/javax/validation/mapping" version="1.1"><default-package>com.journaldev.validator.hibernate.model</default-package><bean class="EmployeeXMLValidation" ignore-annotations="true"><field name="id"><constraint annotation="javax.validation.constraints.Min"><element name="value">1</element></constraint></field><field name="name"><constraint annotation="javax.validation.constraints.NotNull" /><constraint annotation="javax.validation.constraints.Size"><element name="min">5</element><element name="max">30</element></constraint></field><field name="email"><constraint annotation="org.hibernate.validator.constraints.Email" /></field><field name="creditCardNumber"><constraint annotation="org.hibernate.validator.constraints.CreditCardNumber" /></field></bean></constraint-mappings>

default-package用于定义基础包,以便我们可以跳过长包名称。

ignore-annotations用于告诉Hibernate验证器忽略类中存在的任何注释以进行验证,仅执行xml文件中配置的验证。

我们可以在一个文件中有多个bean验证,我们需要将此文件加载到验证器工厂配置,稍后将给出一个示例。

属性级别约束

我们也可以对getter方法应用约束,我们不应该将它应用于setter方法。此外,我们应该避免对字段和getter方法应用约束,因为它将被验证两次。

MyBean.java


package com.journaldev.validator.hibernate.model;import javax.validation.constraints.NotNull;public class MyBean {private String name;@NotNullpublic String getName() {return name;}public void setName(String name) {this.name = name;}
}

使用继承进行Hibernate验证

Bean验证是继承的,因此如果我们验证子类的对象,那么也将执行父类中的任何验证。

MyChildBean.java


package com.journaldev.validator.hibernate.model;import javax.validation.constraints.NotNull;public class MyChildBean extends MyBean {private String data;@NotNullpublic String getData() {return data;}public void setData(String data) {this.data = data;}
}

如果我们将验证实例MyChildBean,MyBean名称字段也将被验证。

使用@Valid注释使用Composition进行验证

我们可以使用@Valid注释组合,以便执行它的验证。

AnotherBean.java


package com.journaldev.validator.hibernate.model;import javax.validation.Valid;
import javax.validation.constraints.NotNull;public class AnotherBean {@NotNull@Validprivate MyChildBean childBean;public MyChildBean getChildBean() {return childBean;}public void setChildBean(MyChildBean childBean) {this.childBean = childBean;}
}

现在,如果我们验证AnotherBean实例,MyChildBean对象也将被验证。

方法参数Hibernate验证

我们也可以为方法参数定义约束,下面给出一个简单的例子。

ParamValidationBean.java


package com.journaldev.validator.hibernate.model;import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;public class ParamValidationBean {private String name;//using @NotNull at constructor rather than at fieldpublic ParamValidationBean(@NotNull String name){this.name = name;}public void printData(@NotNull @Size(min=5) String data){System.out.println("Data is::"+data);}public String getName() {return name;}}

Hibernate Validator示例测试程序

我们已经看到了很多验证方案,这里是测试程序,用于显示验证它们的过程。

ValidatorTest.java


package com.journaldev.validator.hibernate.main;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.lang.reflect.Method;
import java.util.Set;import javax.validation.Configuration;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.executable.ExecutableValidator;import org.hibernate.validator.HibernateValidator;import com.journaldev.validator.hibernate.model.AnotherBean;
import com.journaldev.validator.hibernate.model.EmpIdCheck;
import com.journaldev.validator.hibernate.model.Employee;
import com.journaldev.validator.hibernate.model.EmployeeXMLValidation;
import com.journaldev.validator.hibernate.model.MyChildBean;
import com.journaldev.validator.hibernate.model.ParamValidationBean;public class ValidatorTest {public static void main(String[] args) throws FileNotFoundException, NoSuchMethodException, SecurityException {//Getting Validator instance with AnnotationsValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();Validator validator = validatorFactory.getValidator();//If there are multiple JSR303 implementations in classpath//we can get HibernateValidator specifically tooValidatorFactory hibernateVF = Validation.byProvider(HibernateValidator.class).configure().buildValidatorFactory();System.out.println("\nSimple field level validation example");Employee emp = new Employee(-1, "Name","email","123");Set<ConstraintViolation<Employee>> validationErrors = validator.validate(emp);if(!validationErrors.isEmpty()){for(ConstraintViolation<Employee> error : validationErrors){System.out.println(error.getMessageTemplate()+"::"+error.getPropertyPath()+"::"+error.getMessage());}}System.out.println("\nXML Based validation example");//XML Based validationConfiguration<?> config = Validation.byDefaultProvider().configure();config.addMapping(new FileInputStream("employeeXMLValidation.xml"));ValidatorFactory validatorFactory1 = config.buildValidatorFactory();Validator validator1 = validatorFactory1.getValidator();EmployeeXMLValidation emp1 = new EmployeeXMLValidation(10, "Name","email","123");Set<ConstraintViolation<EmployeeXMLValidation>> validationErrors1 = validator1.validate(emp1);if(!validationErrors1.isEmpty()){for(ConstraintViolation<EmployeeXMLValidation> error : validationErrors1){System.out.println(error.getMessageTemplate()+"::"+error.getInvalidValue()+"::"+ error.getPropertyPath()+"::"+error.getMessage());}}System.out.println("\nValidation Group example");validationErrors = validator.validate(emp, EmpIdCheck.class);if(!validationErrors.isEmpty()){for(ConstraintViolation<Employee> error : validationErrors){System.out.println(error.getMessageTemplate()+"::"+error.getPropertyPath()+"::"+error.getMessage());}}System.out.println("\nValidation with inheritance example");//Validation inheritance and Property-level constraints exampleMyChildBean childBean = new MyChildBean();Set<ConstraintViolation<MyChildBean>> validationInheritanceErrors = validator.validate(childBean);if(!validationInheritanceErrors.isEmpty()){for(ConstraintViolation<MyChildBean> error : validationInheritanceErrors){System.out.println(error.getMessageTemplate()+"::"+error.getPropertyPath()+"::"+error.getMessage());}}System.out.println("\nValidation in composition using @Valid annotation");//@Valid annotation - validation in composition exampleAnotherBean compositionBean = new AnotherBean();compositionBean.setChildBean(new MyChildBean());Set<ConstraintViolation<AnotherBean>> validationCompositionErrors = validator.validate(compositionBean);if(!validationCompositionErrors.isEmpty()){for(ConstraintViolation<AnotherBean> error : validationCompositionErrors){System.out.println(error.getMessageTemplate()+"::"+error.getPropertyPath()+"::"+error.getMessage());}}System.out.println("\nParameter validation example");ParamValidationBean paramValidationBean = new ParamValidationBean("Pankaj");Method method = ParamValidationBean.class.getMethod("printData", String.class);Object[] params = {"1234"};ExecutableValidator executableValidator = validator.forExecutables();Set<ConstraintViolation<ParamValidationBean>> violations = executableValidator.validateParameters(paramValidationBean, method, params);if(!violations.isEmpty()){for(ConstraintViolation<ParamValidationBean> error : violations){System.out.println(error.getMessageTemplate()+"::"+error.getPropertyPath()+"::"+error.getMessage());}}}}

当我们运行上面的hibernate验证器示例程序时,我们得到以下输出。


Jul 25, 2014 3:51:56 AM org.hibernate.validator.internal.util.Version <clinit>
INFO: HV000001: Hibernate Validator 5.1.1.FinalSimple field level validation example
{javax.validation.constraints.Size.message}::name::size must be between 5 and 30
{org.hibernate.validator.constraints.CreditCardNumber.message}::creditCardNumber::invalid credit card number
{org.hibernate.validator.constraints.Email.message}::email::Invalid email addressXML Based validation example
{org.hibernate.validator.constraints.Email.message}::email::email::Invalid email address
{javax.validation.constraints.Size.message}::Name::name::size must be between 5 and 30
{org.hibernate.validator.constraints.CreditCardNumber.message}::123::creditCardNumber::invalid credit card numberValidation Group example
{javax.validation.constraints.Min.message}::id::must be greater than or equal to 1Validation with inheritance example
{javax.validation.constraints.NotNull.message}::data::may not be null
{javax.validation.constraints.NotNull.message}::name::may not be nullValidation in composition using @Valid annotation
{javax.validation.constraints.NotNull.message}::childBean.data::may not be null
{javax.validation.constraints.NotNull.message}::childBean.name::may not be nullParameter validation example
{javax.validation.constraints.Size.message}::printData.arg0::size must be between 5 and 2147483647

以上hibernate验证器测试程序的重点是:

  1. Validator实例是线程安全的,因此我们可以缓存它并重用它。
  2. 如果存在多个JSR303实现,那么我们可以使用Validation.byProvider()方法获取Hibernate Validator实例。
  3. 注意使用组的验证,它只验证属于组的字段。
  4. ExecutableValidator用于验证方法的参数。
  5. ExecutableValidator提供验证构造函数参数和返回值的方法,这些方法是validateReturnValue()validateConstructorParameters()validateConstructorReturnValue()

Hibernate Validator自定义验证和Spring Framework集成

我们也可以创建自己的自定义验证器,请阅读Spring Hibernate验证器示例以更好地理解此功能。

Hibernate验证器摘要

Hibernate Validator和JSR303一起提供了交叉bean验证实现的基础,如果与面向方面编程一起使用,我们可以将所有bean验证与业务逻辑分开。您可以从以下链接下载最终项目并了解更多信息。

下载Hibernate Validator项目

参考文献
Hibernate Validator 
JSR 303

转载来源:https://www.journaldev.com/3626/hibernate-validator-jsr303-example-tutorial

Hibernate Validator JSR303示例教程相关推荐

  1. Hibernate命名查询示例 - @NamedQuery

    Hibernate命名查询示例 - @NamedQuery 欢迎使用Hibernate命名查询示例教程.我们看到了如何在Hibernate中使用HQL和Native SQL Query.如果有很多查询 ...

  2. HQL - Hibernate查询语言 - 示例教程

    HQL - Hibernate查询语言 - 示例教程 HQL或Hibernate查询语言是Hibernate Framework的面向对象查询语言.HQL与SQL非常相似,只是我们使用Objects而 ...

  3. Hibernate Criteria示例教程

    Hibernate Criteria示例教程 欢迎使用Hibernate Criteria示例教程.今天我们将研究Hibernate中的Criteria. Hibernate Criteria 大多数 ...

  4. Spring MVC Hibernate MySQL集成CRUD示例教程

    Spring MVC Hibernate MySQL集成CRUD示例教程 我们在上一篇教程中学习了如何集成Spring和Hibernate.今天,我们将继续前进,并将Spring MVC和Hibern ...

  5. Spring Hibernate集成示例教程

    Spring Hibernate集成示例教程(Spring 4 + Hibernate 3和Hibernate 4) Spring是最常用的Java EE Framework之一,而Hibernate ...

  6. Primefaces,Spring 4 with JPA(Hibernate 4 / EclipseLink)示例教程

    Primefaces,Spring 4 with JPA(Hibernate 4 / EclipseLink)示例教程 Java Persistence API是标准规范.它提供了一个由不同实现者框架 ...

  7. Struts2 Hibernate集成示例教程

    Struts2 Hibernate集成示例教程 Struts2和Hibernate都是各自领域中广泛使用的框架.今天我们将学习如何将Struts2 Web应用程序框架与Hibernate ORM框架集 ...

  8. JSF Spring Hibernate集成示例教程

    JSF Spring Hibernate集成示例教程 欢迎使用JSF Spring Hibernate Integration示例教程.在上一篇教程中,我们了解了如何将JSF和Spring框架集成在一 ...

  9. Primefaces Spring和Hibernate集成示例教程

    Primefaces Spring和Hibernate集成示例教程 欢迎使用Spring Primefaces和Hibernate Integration示例.框架之间的集成是一项复杂的任务,而且大多 ...

最新文章

  1. 独家 | 将时间信息编码用于机器学习模型的三种编码时间信息作为特征的三种方法...
  2. ​iOS 9音频应用播放音频之第一个ios9音频实例2
  3. 排队五小时才能吃上一口的Popeyes,要借阿里云数据中台10年内开足1500家门店
  4. OkHttp3介绍(1)
  5. 内存管理:Linux Memory Management:MMU、段、分页、PAE、Cache、TLB
  6. Ubuntu 11.10搭建和配置Nagios
  7. Python加密保护-对可执行的exe进行保护
  8. 计算机专业知识综合应用题,2015年计算机综合考研及解析之综合应用题(一)...
  9. 关于Android工程师转成vue的三两事儿(4)--webpack
  10. Selenium FirePath的安装和使用
  11. 关系抽取方法总结(基于规则-传统机器学习-深度学习)
  12. 【win10专业版】如何检测声卡是否损坏
  13. android进阶2之有道词典开发,Android进阶2之有道词典开发
  14. 2021-02-09
  15. JS基础----函数应用 案例
  16. 区分线性系统和非线性系统
  17. 10bit显示器测试软件,10bit究竟是什么?10bit显示器画质更好?
  18. android WebView多标签,加速解决卡顿,视频播放笔记
  19. 计算机系一班班会,计算机学院计算机类20级1班举行“爱在身边,温馨家园”主题班会...
  20. 仿作苏宁易购主页顶端

热门文章

  1. 9:38 2009-7-29
  2. SEO之Google--PageRank优化剖析(一)
  3. 如何在终端下截取一个完整长度的网页截图
  4. Objective-C 2.0 with Cocoa Foundation--- 7,对象的初始化以及实例变量的作用域
  5. CodeIgniter 合作 Authorize.net
  6. Unix——《Unix网络编程》配置unp.h头文件
  7. Linux文件目录结构一览表
  8. Java—抽象类和接口的区别
  9. 石头剪刀布小游戏开发的需求说明
  10. django-orm操作流程