视频播放地址
- 解读Hibernate-Validator官方文档入门篇
http://v.youku.com/v_show/id_XMzk1NTY1NjkxMg==.html
1.起步
本章将向您展示如何开始使用Hibernate Validator,即Bean Validation的参考实现(RI)对于以下的快速启动,您需要:(This chapter will show you how to get started with Hibernate Validator, the reference implementation (RI) of Bean Validation. For the following quick-start you need:)
- maven
- jdk8
- 有网络
1.1 建立工程
为了在Maven项目中使用Hibernate Validator,只需将下列依赖项添加到pom.xml:
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.13.Final</version>
</dependency>
这个传递性依赖于bean验证API__ (javax.validation:validation-api:2.0.1.Final).__
1.1.1 EL 表达式
Hibernate验证器需要统一表达式语言(JSR 341)的实现,用于评估约束违反消息中的动态表达式(see Section 4.1, “Default message interpolation”)。当您的应用程序运行在JavaEE容器(如JBoss)中时,容器已经提供了EL实现。但是,在Java SE环境中,必须将实现作为依赖关系添加到POM文件中。例如,可以使用JSR 341引用实现添加以下依赖项:
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.1-b09</version>
</dependency>
NOTE: 对于无法提供EL实现的环境,Hibernate验证器提供了一个第12.9节“PuleMeLaseIdabor”。然而,这种插值器(interpolator)的使用不是符合bean验证规范的。
(For environments where one cannot provide a EL implementation Hibernate Validator is offering aSection 12.9, “ParameterMessageInterpolator”. However, the use of this interpolator is not Bean Validation specification compliant.)
1.1.2 CDI (Contexts and Dependency Injection for Java TM EE, JSR 346)
Bean验证定义了与CDI(JavaTM EE, JSR 346的上下文和依赖注入)的集成点。如果您的应用程序运行在不提供这种集成的环境中,则可以通过将以下Maven依赖项添加到POM中,使用Hibernate验证器CDI可移植扩展插件:
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator-cdi</artifactId>
<version>6.0.13.Final</version>
</dependency>
[Java EE】–Contexts and Dependency Injection (上下文与依赖注入)04 这里有简单的介绍JSR 346
Note:注意,在__JavaEE应用服务器上运行的应用程序通常不需要添加该依赖项__。您可以在第11.3节“CDI”中了解更多关于Bean验证和CDI的集成。Section 11.3, “CDI”.
1.1.3 Running with a security manager
Hibernate验证程序支持启用安全管理器运行。为此,必须为Hibernate Validator、Bean验证API、Classmate和JBoss Logging的代码库以及调用Bean Validation的代码库分配若干权限。下面显示了如何通过策略文件实现这一点,这是由Java默认策略实现处理的:
grant codeBase "file:path/to/hibernate-validator-6.0.13.Final.jar" {
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
permission java.lang.RuntimePermission "accessDeclaredMembers";
permission java.lang.RuntimePermission "setContextClassLoader";
permission org.hibernate.validator.HibernateValidatorPermission "accessPrivateMembers";
// Only needed when working with XML descriptors (validation.xml or XML constraint mappings)
permission java.util.PropertyPermission "mapAnyUriToUri", "read";
};
grant codeBase "file:path/to/validation-api-2.0.1.Final.jar" {
permission java.io.FilePermission "path/to/hibernate-validator-6.0.13.Final.jar", "read";
};
grant codeBase "file:path/to/jboss-logging-3.3.2.Final.jar" {
permission java.util.PropertyPermission "org.jboss.logging.provider", "read";
permission java.util.PropertyPermission "org.jboss.logging.locale", "read";
};
grant codeBase "file:path/to/classmate-1.3.4.jar" {
permission java.lang.RuntimePermission "accessDeclaredMembers";
};
grant codeBase "file:path/to/validation-caller-x.y.z.jar" {
permission org.hibernate.validator.HibernateValidatorPermission "accessPrivateMembers";
};
1.1.5 在WildFly中更新Hibernate验证器
WildFly应用服务器中包含了Hibernate验证器。为了将Bean Validation API和Hibernate Validator的服务器模块更新到最新的和最大的,可以使用WildFly的补丁机制。
可以使用以下依赖项从SourceForge或从Maven Central下载补丁文件:
- Example 1.5: Maven dependency for WildFly 14.0.0.Beta1 patch file
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator-modules</artifactId>
<version>6.0.13.Final</version>
<classifier>wildfly-14.0.0.Beta1-patch</classifier>
<type>zip</type>
</dependency>
- Example 1.6: Maven dependency for WildFly 13.0.0.Final patch file
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator-modules</artifactId>
<version>6.0.13.Final</version>
<classifier>wildfly-13.0.0.Final-patch</classifier>
<type>zip</type>
</dependency>
下载了补丁文件后,可以通过运行此命令将其应用于WildFly:
$JBOSS_HOME/bin/jboss-cli.sh patch apply hibernate-validator-modules-6.0.13.Final-wildfly-14.0.0.Beta1-patch.zip
如果要撤消补丁并返回最初随服务器一起提供的Hibernate Validator版本,请运行以下命令:
$JBOSS_HOME/bin/jboss-cli.sh patch rollback --reset-configuration=true
~~1.1.6 Java 9 ~~
…
1.2 应用约束(Applying constraints)
让我们直接讲解一个例子,看看如何应用约束(也就是Hibernate Validator)。
package org.hibernate.validator.referenceguide.chapter01;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
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 licencePlate, int seatCount) {
this.manufacturer = manufacturer;
this.licensePlate = licencePlate;
this.seatCount = seatCount;
}
//getters and setters ...
}
The @NotNull, @Size and @Min annotations are used to declare the constraints which should be applied to the fields of a Car instance:(@NotNull、@Size和@Min注释用于声明应该应用于Car实例字段的约束)
- manufacturer 字段不能为null
- licensePlate must never be null and must be between 2 and 14 characters long
- seatCount must be at least 2
您可以在GitHub上的Hibernate Validator源代码库中找到本参考指南中使用的所有示例的完整源代码。
https://github.com/hibernate/hibernate-validator/tree/master/documentation/src/test 这里不怎么好找到
1.3 验证约束( Validating constraints)
要执行这些约束的验证,您需要使用一个验证器实例。让我们看一下汽车的单元测试:[可以自己下载下来玩一下子]
package org.hibernate.validator.referenceguide.chapter01;
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;
import static org.junit.Assert.assertEquals;
public class CarTest {
private static Validator validator;
@BeforeClass
public static void setUpValidator() {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();
}
@Test
public void manufacturerIsNull() {
Car car = new Car( null, "DD-AB-123", 4 );
Set<ConstraintViolation<Car>> constraintViolations =
validator.validate( car );
assertEquals( 1, constraintViolations.size() );
assertEquals( "must not be null", constraintViolations.iterator().next().getMessage() );
}
@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()
);
}
@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()
);
}
@Test
public void carIsValid() {
Car car = new Car( "Morris", "DD-AB-123", 2 );
Set<ConstraintViolation<Car>> constraintViolations =
validator.validate( car );
assertEquals( 0, constraintViolations.size() );
}
}
In the setUp() method a Validator object 从验证器工厂检索验证器对象。验证器实例是线程安全的,可以多次重用。因此,它可以安全地存储在静态字段中,并在测试方法中使用来验证不同的Car实例。
validate()方法返回一组ConstraintViolation实例,您可以迭代这些实例以查看发生了哪些验证错误。前三种测试方法显示了一些预期的约束违反:
- The @NotNull constraint on manufacturer is violated in manufacturerIsNull()
- The @Size constraint on licensePlate is violated in licensePlateTooShort()
- The @Min constraint on seatCount is violated in seatCountTooLow()
- 如果对象验证成功,validate()将返回一个空集,如carIsValid()所示。
Note:注意,只使用来自包javax.validation校验的类。这些是从bean验证API提供的。没有直接引用来自Hibernate验证器的类,从而产生可移植代码。
1.4 下一步去哪里?(Where to go next?)
这结束了5分钟的穿越Hibernate验证程序和Bean验证的世界。继续探索代码示例或查看在第14章(进一步阅读)中引用的其他示例。
若要了解有关bean和属性验证的更多信息,请继续阅读第2章,声明和验证bean约束。如果您有兴趣使用bean验证来验证方法前、后条件,请参阅第3章,声明和验证方法约束。如果您的应用程序具有特定的验证需求,请参见第6章,创建自定义约束。