使用Bean Validation 2.0验证Java Bean

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. 定义验证注解
  2. 可通过验证器验证
  3. 根据返回的结果确定输入是否符合约束

参考

[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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值