在Java SE中使用Hibernate Bean Validator

Bean Validation主页上指出:“ Bean Validation是Java规范,…在Java SE中运行,但集成在Java EE(6和7)中。” 这篇文章演示了如何在Java EE容器之外使用Java Bean验证参考实现( Hibernate Validator )。 这篇文章中的示例基于Hibernate Validator 5.1.3 Final ,可从http://hibernate.org/validator/downloads下载。

“ Hibernate Validator入门 ”指出,Hibernate Validator需要统一表达语言 ( JSR 341 )和上下文和依赖项注入 ( CDI / JSR 346 )的实现。 这些规范的实现可在符合Java EE的现代容器(应用程序服务器)中使用,但是在Java SE环境中使用Hibernate Validator需要采购和使用单独的实现。

“ Hibernate Validator入门”页面提供了一种Maven XML,可以用来识别对Expression Language API (我正在使用Expression Language 3.0 API ), Expression Language实施 (我正在使用Expression Language Implementation 2.2.6 )的依赖性。 ,以及Hibernate Validator CDI便携式扩展 (我正在使用Hibernate Validator便携式扩展5.1.3 Final )。 我还使用Bean Validation API 1.1.0 Final , JBoss Logging 3.3.0 Final和ClassMate 1.2.0来构建和运行示例。

本文中演示的bean验证示例定义了三个Java类。 Car.java是从“ Hibernate Validator入门 ”页面上提供的示例改编而成的一类,接下来显示其代码清单。

汽车.java

package dustin.examples;import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;/*** Example adapted from "Getting Started with Hibernate Validator"* (http://hibernate.org/validator/documentation/getting-started/).*/
public class Car
{@NotNullprivate String manufacturer;@NotNull@Size(min = 2, max = 14)private String licensePlate;@Min(2)private int seatCount;public Car(final String manufacturer, final String licencePlate, final int seatCount){this.manufacturer = manufacturer;this.licensePlate = licencePlate;this.seatCount = seatCount;}public String getManufacturer(){return manufacturer;}public String getLicensePlate(){return licensePlate;}public int getSeatCount(){return seatCount;}@Overridepublic String toString(){return "Car{" +"manufacturer='" + manufacturer + '\'' +", licensePlate='" + licensePlate + '\'' +", seatCount=" + seatCount +'}';}
}

Garage.java定义了Garage.java示例中使用的另一个类, Garage.java主要是Car的多个实例的包装。 它的主要目的是帮助说明Hibernate Bean Validator支持的递归验证。

车库.java

package dustin.examples;import javax.validation.Valid;
import javax.validation.constraints.Size;import java.util.Collections;
import java.util.HashSet;
import java.util.Set;/*** Holds cars.*/
public class Garage
{@Size(min = 1)@Validprivate final Set<Car> cars = new HashSet<>();public Garage() {}public void addCar(final Car newCar){cars.add(newCar);}public Set<Car> getCars(){return Collections.unmodifiableSet(this.cars);}
}

上面列出的Garage代码使用@Valid批注指示也应验证该类持有的Car实例(“验证级联”)。

本文的示例中使用的最后一个Java类是将实际执行两个带bean验证注释的类CarGarage验证的类。 该类的清单如下所示。

HibernateValidatorDemonstration.java

package dustin.examples;import static java.lang.System.out;import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.ValidatorFactory;
import javax.validation.Validator;
import java.util.Set;/*** Demonstrate use of Hibernate Validator.*/
public class HibernateValidatorDemonstration
{private final Validator validator;public HibernateValidatorDemonstration(){final ValidatorFactory factory = Validation.buildDefaultValidatorFactory();validator = factory.getValidator();}public void demonstrateValidator(){final Car nullManufacturerCar = new Car(null, "ABC123", 4);final Set<ConstraintViolation<Car>> nullMfgViolations = validator.validate(nullManufacturerCar);printConstraintViolationsToStandardOutput("Null Manufacturer Example", nullMfgViolations);final Car nullLicenseCar = new Car("Honda", null, 3);final Set<ConstraintViolation<Car>> nullLicenseViolations = validator.validate(nullLicenseCar);printConstraintViolationsToStandardOutput("Null License Example", nullLicenseViolations);final Car oneSeatCar = new Car("Toyota", "123ABC", 1);final Set<ConstraintViolation<Car>> tooFewSeatsViolations = validator.validate(oneSeatCar);printConstraintViolationsToStandardOutput("Too Few Seats Example", tooFewSeatsViolations);final Car oneDigitLicenseCar = new Car("General Motors", "I", 2);final Set<ConstraintViolation<Car>> tooFewLicenseDigitsViolation = validator.validate(oneDigitLicenseCar);printConstraintViolationsToStandardOutput("Too Few License Digits Example", tooFewLicenseDigitsViolation);final Car nullManufacturerNullLicenseCar = new Car(null, null, 4);final Set<ConstraintViolation<Car>> nullMfgLicenseViolation = validator.validate(nullManufacturerNullLicenseCar);printConstraintViolationsToStandardOutput("Null Manufacturer and Null License Example", nullMfgLicenseViolation);final Garage garage = new Garage();final Set<ConstraintViolation<Garage>> noCarsInGarage = validator.validate(garage);printConstraintViolationsToStandardOutput("No Cars in Garage", noCarsInGarage);garage.addCar(oneDigitLicenseCar);garage.addCar(oneSeatCar);garage.addCar(nullManufacturerNullLicenseCar);final Set<ConstraintViolation<Garage>> messedUpCarsInGarage = validator.validate(garage);printConstraintViolationsToStandardOutput("Messed Up Cars in Garage", messedUpCarsInGarage);}private <T> void printConstraintViolationsToStandardOutput(final String title,final Set<ConstraintViolation<T>> violations){out.println(title);for (final ConstraintViolation<T> violation : violations){out.println("\t" + violation.getPropertyPath() + " " + violation.getMessage());}}public static void main(final String[] arguments){final HibernateValidatorDemonstration instance = new HibernateValidatorDemonstration();instance.demonstrateValidator();}
}

上面的代码具有对javax.validation.Validator.validate(T,Class <?>)的多次调用,这些调用演示了对正在验证其实例的类的注释的有效性。 几个示例验证对象的单个验证冲突,一个示例验证对象的多个验证冲突,最后一个示例演示成功的级联冲突检测。

HibernateValidatorDemonstration类具有main(String[])函数,可以在Java SE环境中执行该函数(假定必需的JAR位于运行时类路径上)。 接下来显示运行上述演示类的输出:

Jul 19, 2015 9:30:05 PM org.hibernate.validator.internal.util.Version 
INFO: HV000001: Hibernate Validator 5.1.3.Final
Null Manufacturer Examplemanufacturer may not be null
Null License ExamplelicensePlate may not be null
Too Few Seats ExampleseatCount must be greater than or equal to 2
Too Few License Digits ExamplelicensePlate size must be between 2 and 14
Null Manufacturer and Null License Examplemanufacturer may not be nulllicensePlate may not be null
No Cars in Garagecars size must be between 1 and 2147483647
Messed Up Cars in Garagecars[].licensePlate size must be between 2 and 14cars[].manufacturer may not be nullcars[].licensePlate may not be nullcars[].seatCount must be greater than or equal to 2

结论

这篇文章证明了Bean验证规范的参考实现Hibernate Bean Validator可以在Java SE环境中执行。 作为演示的一部分,还讨论了与Bean验证规范和Hibernate Bean验证器实现相关的一些基本概念。

其他资源

  • Java技巧:独立实现中的休眠验证
  • 如何将javax.validation导入我的Java SE项目?
  • 使用Hibernate Validator满足您的验证需求

翻译自: https://www.javacodegeeks.com/2015/07/using-hibernate-bean-validator-in-java-se.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员应该如何才能买房?

前段时间对象问我应该在哪买房&#xff0c;我的意见是现在一个小的城市搞个刚需房&#xff0c;后面可以再换个一线的大房子&#xff0c;后来她的建议是在工作附近搞一套&#xff0c;这样不用一边工作一边还房贷。无奈只能咨询各位大咖。看完这个大佬的经历&#xff0c;发现好多…

css规则的样式构成,Css 基本的规则写法

样式表的写法&#xff1a;css的语法由一些标志构成&#xff0c;就是一个基本的样式表由选择器&#xff0c;属性和属性值构成。Css有标准的写法规则标准的css写法&#xff1a;h1 {Font-family:黑体;}h1:表示选择符Font-family:表示属性&#xff0c;这里的作用是定义字体"黑…

nginx 虚拟主机

环境:2台web服务器&#xff0c;1台nginx服务器&#xff0c;1台客户端 1、配置2台web服务器(关闭iptables&#xff0c;关闭selinux) yum -y install httpd service httpd start exho "192.168.1.10" > /var/www/html/index.html exho "192.168.1.100"…

小程序开发从0到1

公司最近也想做小程序&#xff0c;简单梳理了一下&#xff0c;希望能给新人带来一点启发。 话不多说&#xff0c;直接上干货。 不是码农也想开发的直接采用混合式开发的方案&#xff0c;查漏补缺&#xff0c;用模板肯定会有点生硬&#xff0c;想走的更远建议还是采用原生开发的…

王者荣耀服务器维护啥时候结束,王者荣耀维护几点结束今天?11月10日维护公告...

王者荣耀维护今天几点结束&#xff1f;今天王者荣耀要进行全服的维护了&#xff0c;到时候服务器会选择性的轮流更新&#xff0c;到时候会有玩家登不上游戏&#xff0c;这都是正常的。这次的维护时间非常短只有一个半小时&#xff0c;不过你运气好的话&#xff0c;你的区域会优…

apache.camel_Apache Camel 2.9发布–十大变化

apache.camel在2011年的最后一天&#xff0c;阿帕奇骆驼制品被成功地推到了Maven仓库中&#xff0c;距离香槟酒瓶破裂并进入2012年仅1.5个小时。 2.9版是创纪录的发行版&#xff0c;自5个月前发布2.8版以来&#xff0c;已解决了约500张JIRA票证。 以下是10个最明显的改进和新功…

配置mysql使其允许外部ip进行登录

这两天在做一个数据库的项目&#xff0c;用到了mysql&#xff0c;需要通过外部的ip远程访问mysql&#xff0c;发现默认的mysql是不允许远程访问的&#xff0c;需要做简单的配置。 如下&#xff1a; 1. 打开一个终端&#xff08;cmd&#xff09;输入 mysql -u用户名 -p密码 #&am…

javaScript入门基础说明

JavaScript 教程 JavaScript 是 Web 的编程语言。 所有现代的 HTML 页面都使用 JavaScript。 JavaScript 非常容易学&#xff0c;本教程将教你打开 JavaScript 的大门 浏览器中的 JavaScript 能做什么&#xff1f; 现代的 JavaScript 是一种“安全”语言。 它不提供对内存…

ActiveMQ作为Logstash的消息代理

扩展Logstash时&#xff0c;通常会添加一个消息代理&#xff0c;该消息代理用于在一个或多个Logstash节点处理传入消息之前临时缓冲传入的消息。 数据通过像Beaver这样的发运人推送到代理&#xff0c; Beaver读取日志文件并将每个事件发送到代理。 或者&#xff0c;应用程序可以…

mysql 索引- 笔记

索引 mysql最常用的索引结构是btree(O(log(n)))&#xff0c;但是总有一些情况下我们为了更好的性能希望能使用别的类型的索引。hash就是其中一种选择&#xff0c;例如我们在通过用户名检索用户id的时候&#xff0c;他们总是一对一的关系&#xff0c;用到的操作符只是而已&#…

在编译器中鼠标光标变成下横线的解决办法

适用于各种智能编译器&#xff0c;HB-X,VSCode,ST3,IDEA等。 问题&#xff1a; 按一下键盘上的&#xff0c;insert 键。

java自定义序列化_Java中的自定义国际化(i18n)

java自定义序列化国际化&#xff08;i18n&#xff09;在我们的软件项目中非常重要。 它主要带来以下好处&#xff1a; 将UI字符串外部化为代码文件以外的外部文件&#xff0c;以及易于管理的UI内容。 支持多种语言。 在这篇文章中&#xff0c;将为Eclipse和Java项目提供一个i…

如何科学高效的学习Web前端开发?

近几年,web前端开发工程师越来越火了,薪资待遇也快接近后端开发工程师了。很多准备入行前端开发工程师的小伙伴们,不知道准备得怎么样了呢? 有的朋友在想方设法的学习,争取在年后的金九银十能靠实力找到一份满意的工作!有的小伙伴在准备准备回家过个团圆年,来年再战!还有…

Apache Drill:如何创建新功能?

Apache Drill允许用户使用ANSI SQL探索任何类型的数据。 这很棒&#xff0c;但是Drill的作用远远不止于此&#xff0c;它允许您创建自定义函数来扩展查询引擎。 这些自定义功能具有任何Drill基本操作的所有性能&#xff0c;但是允许执行这些性能会使编写这些功能比您期望的要复…

Json的访问

JSON&#xff1a;JavaScript 对象表示法&#xff08;JavaScript Object Notation&#xff09; 写法&#xff1a;名称/值对 访问方法&#xff1a;可以通过 data.名称 访问&#xff0c;也可以通过 data[名称] 访问 注意&#xff1a;名称加不加引号都可以&#xff0c;但是加引号安…

让一个文字在背景图片水平居中的方法

最近工作中在做那个可视化大屏&#xff0c;图中用到了大量的装饰图片&#xff0c;下面看一下文字怎么在图片中水平居中。 这个方法比较好用&#xff0c;其他的方法嵌入太多可能不是特别好使&#xff0c;尤其嵌入到多个框架中。 html <!DOCTYPE html> <html><h…

Objective-C中,ARC下的 strong和weak指针原理解释

Objective-C中&#xff0c;ARC下的 strong和weak指针原理解释 提示&#xff1a;本文中所说的"实例变量"即是"成员变量"&#xff0c;"局部变量"即是"本地变量" 一、简介 ARC是自iOS 5之后增加的新特性&#xff0c;完全消除了手动管理内…

elementui去掉表格所有边框

/deep/.el-table {border: 0;th,tr,td{border: 0;background-color: #fff;}&::before {height: 0px;}&::after {width: 0;}.el-table__fixed:before {height: 0;}}

cdi 2.7.5_集成测试CDI 1.0和Spring 3.1中的作用域bean

cdi 2.7.5在这篇博客文章中&#xff0c;我描述了如何在Spring和CDI中使用作用域bean进行集成测试。 一切都用小代码示例进行说明。 使用范围进行集成测试并不是特别容易。 想象一下存在于会话范围内的bean&#xff0c;例如UserCredentials 。 在集成测试中&#xff0c;通常没有…

工作流编写教程

介绍 ONES中使用了flowchart.js作为前端展示&#xff0c;并且扩展了flowchart.js的流程描述语言。flowchart.js 参见&#xff1a; https://github.com/adrai/flowchart.js 描述语言分为三部分&#xff0c;使用\n\n(空一行)作为分割&#xff0c;分别是节点定义、执行流程描述、节…