参数校验 Hibernate-Validator

4,780 阅读3分钟

需求

在 RESTful 的接口服务中,会有各种各样的入参,我们不可能完全不做任何校验就直接进入到业务处理的环节,通常我们会有一个基础的数据验证的机制,待这些验证过程完毕,结果无误后,参数才会进入到正式的业务处理中。

而数据验证又分为两种

  • 一种是无业务关联的规则性验证
  • 一种是根据现有数据进行的联动性数据验证(简单来说,参数的合理性,需要查数据库,比如用户名不能重复)

第二中只能一般只能在业务中校验,但第一种可以通过 Hibernate-Validator 来做无业务关联的规则性验证。

Hibernate-Validator的主要使用的方式就是注解的形式,并且是“零配置”的,无需配置也可以使用。

导入依赖

<dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>6.0.17.Final</version>
</dependency>
如果项目的框架是 spring boot 的话,在 spring-boot-starter-web 中已经包含了 Hibernate-validator 的依赖。

依赖关系

注解

javax.validation.constraints 的注解和 org.hibernate.validator.constraints 的注解可以混用

来自 javax.validation.constraints 的注解

import javax.validation.constraints.*;

//被注释的元素,值必须是一个字符串,不能为null,且调用trim()后,长度必须大于0
@NotBlank(message = "")

//被注释的元素,值不能为null,但可以为"空",用于基本数据类型的非空校验上,而且被其标注的字段可以使用 @size、@Max、@Min 等对字段数值进行大小的控制
@NotNull(message = "")

//被注释的的元素,值不能为null,且长度必须大于0,一般用在集合类上面
@NotEmpty(message = "")

//被注释的元素必须符合指定的正则表达式。
@Pattern(regexp = "", message = "")

//被注释的元素的大小必须在指定的范围内。
@Size(min =, max =)

//被注释的元素,值必须是一个数字,且值必须大于等于指定的最小值
@Min(value = long以内的值, message = "")

//被注释的元素,值必须是一个数字,且值必须小于等于指定的最大值
@Max(value = long以内的值, message = "")





//被注释的元素,值必须是一个数字,其值必须大于等于指定的最小值
@DecimalMin(value = 可以是小数, message = "")

//被注释的元素,值必须是一个数字,其值必须小于等于指定的最大值
@DecimalMax(value = 可以是小数, message = "")

//被注释的元素,值必须为null
@Null(message = "")

//被注释的元素必须是一个数字,其值必须在可接受的范围内
@Digits(integer =, fraction =)

//被注释的元素,值必须为true
@AssertTrue(message = "")

//被注释的元素,值必须为false
@AssertFalse(message = "")

//被注释的元素必须是一个过去的日期
@Past(message = "")

//被注释的元素必须是一个将来的日期
@Future(message = "")

//被注释的元素必须是电子邮件地址
@Email(regexp = "", message = "")

来自 org.hibernate.validator.constraints 的注解

import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;

//被注释的元素必须在合适的范围内
@Range(min =, max =, message = "")

//被注释的字符串的大小必须在指定的范围内
@Length(min =, max =, message = "")

@NotBlank、@NotNull、@NotEmpty 的区别

  • @NotBlank:用于字符串上,值不能为null,且调用trim()后,长度必须大于0
  • @NotNull:用于基本类型及封装类型上,值不能为null
  • @NotEmpty:用于集合类上,且集合长度必须大于0

示例

import lombok.Data;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;


@Data
public class RegisterDTO {

    @NotBlank(message = "用户名不能为空")
    private String userName;

    @NotBlank(message = "密码不能为空")
    private String password;

    @NotBlank(message = "真实姓名不能为空")
    private String realName;

    @Range(min = 0, max = 99, message = "年龄应该在0到99之间")
    private Integer age;

    @Pattern(regexp = "男|女", message = "必须是男或女")
    private String sex;

    @Pattern(regexp = "\\d{3}-\\d{8}|\\d{4}-\\d{7}|\\d{11}", message = "号码不正确")
    private String telephone;

}
注意使用@NotBlank等注解时,一定要和@valid一起使用,不然@NotBlank不起作用

相关文章

Spring 参数校验详解