案例概述java
在这本文中,咱们将介绍使用标准框架验证Java bean的基础知识 - JSR 380,也称为Bean Validation 2.0。web
固然,验证用户输入在大多数应用程序中是一个超常见的要求,Java Bean Validation框架已经成为处理这种逻辑的事实上的标准。编程
JSR 380api
JSR 380是用于bean验证的Java API的规范,是JavaEE和JavaSE的一部分,它使用@NotNull、@Min和@Max等注释确保bean的属性知足特定的标准。数组
此版本须要Java 8或更高版本,并利用Java 8中添加的新功能(如类型注释),并支持Optional和LocalDate等新类型。框架
有关规范的完整信息,请继续阅读JSR 380。less
依赖性ui
咱们将使用Maven示例来显示所需的依赖项,但固然,能够使用各类方式添加这些jar。spa
验证APIhibernate
根据JSR 380规范,validation-api依赖包含标准验证API:
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.0.Final</version>
</dependency>
复制代码
验证API参考实现
Hibernate Validator是验证API的参考实现。
要使用它,咱们必须添加如下依赖项:
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.2.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator-annotation-processor</artifactId>
<version>6.0.2.Final</version>
</dependency>
复制代码
这里快速说明的是,hibernate-validator彻底独立于Hibernate的持久性方面,而且经过将其添加为依赖项,咱们不会将这些持久性方面添加到项目中。
表达式语言依赖关系
JSR 380提供对变量插值的支持,容许在违规消息中使用表达式。
要解析这些表达式,咱们必须在表达式语言API和该API的实现上添加依赖项。GlassFish提供参考实现:
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.el</artifactId>
<version>2.2.6</version>
</dependency>
复制代码
若是未添加这些JAR,您将在运行时收到错误消息,以下所示:
HV000183:没法加载'javax.el.ExpressionFactory'。检查您是否在类路径上有EL依赖项,或使用ParameterMessageInterpolator
使用验证注释
咱们将在这里使用User bean做为主要示例,并为其添加一些简单的验证:
import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.constraints.Email;
public class User {
@NotNull(message = "Name cannot be null")
private String name;
@AssertTrue
private boolean working;
@Size(min = 10, max = 200, message
= "About Me must be between 10 and 200 characters")
private String aboutMe;
@Min(value = 18, message = "Age should not be less than 18")
@Max(value = 150, message = "Age should not be greater than 150")
private int age;
@Email(message = "Email should be valid")
private String email;
// standard setters and getters
}
复制代码
示例中使用的全部注释都是标准的JSR注释:
某些注释接受其余属性,但message属性对全部属性都是通用的。这是当相应属性的值未经过验证时一般会呈现的消息。
能够在JSR中找到的一些其余注释是:
验证注释也能够应用于集合的元素:
List<@NotBlank String> preferences;
复制代码
在这种状况下,将验证添加到选项列表中的任何值。
该规范还支持 Java 8中的新Optional类型:
private LocalDate dateOfBirth;
public Optional<@Past LocalDate> getDateOfBirth() {
return Optional.of(dateOfBirth);
}
复制代码
在这里,验证框架将自动解包LocalDate值并对其进行验证。
程序验证
一些框架 - 例如Spring--只需使用注释就能够经过简单的方法触发验证过程。这主要是为了使咱们没必要与程序验证API进行交互。
如今让咱们进入手动路线并以编程方式设置:
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
复制代码
要验证bean,咱们必须首先拥有Validator对象,该对象使用ValidatorFactory构造。
定义Bean
咱们如今要设置一个无效用户 - 使用空名称值:
User user = new User();
user.setWorking(true);
user.setAboutMe("Its all about me!");
user.setAge(50);
复制代码
验证Bean
如今咱们有了一个Validator,咱们能够经过将它传递给validate方法来验证咱们的bean 。任何违反User对象中定义的约束的行为都将做为Set返回。
Set<ConstraintViolation<User>> violations = validator.validate(user);
复制代码
经过迭代违规,咱们能够使用getMessage方法获取全部违规消息。
for (ConstraintViolation<User> violation : violations) {
log.error(violation.getMessage());
}
复制代码
在咱们的示例中(ifNameIsNull_nameValidationFails),该集合将包含一个ConstraintViolation,消息“ Name not not null”。
案例结论
本文重点介绍了标准Java Validation API的简单传递,并使用javax.validation注释和API 说明了bean验证的基础知识。