第一章节大致讲了三个部分的内容
- 概念 & 功能
- 搭建环境以及它的应用场景
- 演示Car的校验示例。
1、概念 & 功能
Hibernate Validator 是 Jakarta Bean Validation的一种实现。类似于JDBC规范与各数据库驱动Jar之间的关系,类似于ES标准与JavaScript语言的关系。
Hibernate Validator的最新版本6 是Jakarta Bean Validation 2.0的实现。
Hibernate Validator的功能是后台校验数据。在Spring框架中也实现了后台校验功能,spring提供的校验功能没有Hibernate Validator丰富。
2、搭建环境
搭建环境的步骤比较简单,只需要引入Jar包。
当使用校验功能,需要引入hibernate-validator, Maven的配置如下:
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.1.2.Final</version> </dependency>
当在编写校验规则时,使用了EL表达式,需要引入jakarta.el,Maven的配置如下:
<dependency> <groupId>org.glassfish</groupId> <artifactId>jakarta.el</artifactId> <version>3.0.3</version> </dependency>
当在Jakarta EE中集成HibernateValidator时,需要引入hibernate-validator-cdi,其中cdi的含义是context dependency injection,依赖注入,与Spring功能类似。Maven的配置如下:
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator-cdi</artifactId> <version>6.1.2.Final</version> </dependency>
WildFly:略
Java 9:略,因为正在实验阶段,原著:As of Hibernate Validator 6.1.2.Final, support for Java 9 and the Java Platform Module System (JPMS) is experimental。
3、Car示例
示例的分析都写在了代码注释中。
Car实体类
/** * * @File Name: Car.java * @Description: 车实体类,在示例中扮演着被校验的角色 * @version 1.0 * @since JDK 1.8 */ public class Car { // 生产商 @NotNull private String manufacturer; // 车牌号码 @NotNull @Size(min = 2, max = 14) private String licensePlate; // 车座位 @Min(2) private int seatCount; public Car(String manufacturer, String licensePlate, int seatCount) { this.manufacturer = manufacturer; this.licensePlate = licensePlate; this.seatCount = seatCount; } }
CarTest测试类
package ch1; import static org.junit.Assert.assertEquals; import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; import org.junit.BeforeClass; import org.junit.Test; /** * * @File Name: Main.java * @Description: main方法,扮演着测试的角色 * @version 1.0 * @since JDK 1.8 */ public class CarTest { // 校验器 private static Validator validator; @BeforeClass public static void setUpValidator() { ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); validator = factory.getValidator(); } /** * * @Title: manufactureIsNull * @Description: 校验Car的manufacture(制造商)字段 */ @Test public void manufactureIsNull() { // 创建被校验的对象 Car car = new Car(null, "DD-AB-123", 4); // 校验功能,如果校验结果为失败,会返回ConstraintViolation Set<ConstraintViolation<Car>> constraintViolations = validator.validate(car); // 断言,这个是哲学的概念,只有三种结果, 真,假, 未知 // 相等断言: 校验失败的大小为1 assertEquals(1, constraintViolations.size()); // 相等断言: 校验失败的提示信息为"must not be null" // 这个消息为校验失败的默认值 assertEquals("must not be null", constraintViolations.iterator().next().getMessage()); } /** * * @Title: licensePlateTooShort @Description:校验Car的licensePlate(车牌号) */ @Test public void licensePlateTooShort() { // 步骤基本一致,第一步创建被校验的对象 Car car = new Car("Morris", "D", 4); // 校验功能 Set<ConstraintViolation<Car>> constraintViolations = validator.validate(car); // 断言 assertEquals(1, constraintViolations.size()); assertEquals("size must be between 2 and 14", constraintViolations.iterator().next().getMessage()); } /** * * @Title: seatCountTooLow * @Description:校验Car的seatCount(车座) */ @Test public void seatCountTooLow() { // 步骤基本一致,第一步创建被校验的对象 Car car = new Car("Morris", "DD-AB-123", 1); Set<ConstraintViolation<Car>> constraintViolations = validator.validate(car); assertEquals(1, constraintViolations.size()); assertEquals("must be greater than or equal to 2", constraintViolations.iterator().next().getMessage()); } }
示例中有三个步骤:
- 第一步,创建实体类,编写校验规则,之后会学习到更复杂的校验规则
- 第二步,创建校验器,调用validator,之后会更深入理解校验的原理。
- 第三步,获取校验结果,之后会学习更复杂的校验结果形式。