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验证注释的类Car
和Garage
验证的类。 该类的清单如下所示。
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