1 简介
本文将介绍通过标准框架对Java bean的成员进行验证 - JSR 380。
验证用户输入是一个常见的需求。Java Bean验证框架是一个用来处理这类验证逻辑的一套标准。通过使用注解简化我们的验证规则开发。
2 JSR 380
JSR 380[1]是Java API中用来验证Bean所定义的规范。通过@NotNull,@Min 及 @Max等注解实现验证。
3.依赖
本节介绍使用该框架所需的maven依赖。我们需要添加下述依赖完成验证工作。
3.1 Validation API
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.0.Final</version>
</dependency>
3.2 Validation API 实现
Hibernate Validator 是validation 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>
3.3 表达式语言依赖
JSR 380提供对变量插入的支持,可以在验证消息中插入表达式。为了使用这个能力需要添加表达式语言API和其实现的依赖。
<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>
4. 使用注解验证
下面的例子很容易理解,使用注解完成各类验证。
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
}
此外注解还可以用于集合元素的验证。
List<@NotBlank String> preferences;
private LocalDate dateOfBirth;
public Optional<@Past LocalDate> getDateOfBirth() {
return Optional.of(dateOfBirth);
}
通过这个例子可以看到,要加验证使用各种注解即可。完成注解请参考validator-defineconstraints-spec[2]。
5 进行验证
我们定义好各种注解后就可以开始验证,我们通过创建验证器来对注解的Bean验证。
创建对象
User user = new User();
user.setWorking(true);
user.setAboutMe("Its all about me!");
user.setAge(50);
验证
Set<ConstraintViolation<User>> violations = validator.validate(user);
验证后会返回一个Set集合,这里包含了所有不复合约束的结果。如果集合为空,说明对象中的各个成员变量其值合法。
for (ConstraintViolation<User> violation : violations) {
log.error(violation.getMessage());
}
6.总结
使用验证注解简化我们验证工作,通过下述步骤完成验证开发
- 定义验证注解
- 可通过验证器验证
- 根据返回的结果确定输入是否符合约束
参考
[1]JSR 380,https://jcp.org/en/jsr/detail?id=380
[2]validator-defineconstraints-spec,https://docs.jboss.org/hibernate/validator/7.0/reference/en-US/html_single/#validator-defineconstraints-spec