# SpringBootValidator

Validator检验

# 1. 说明

引入对应 Jar 包即可使用

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

默认提供注解如下

注解 描述
@AssertFalse 被注释的元素必须为False
@AssertTrue 被注释的元素必须为True
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Digits(integer=, fraction=) 被注释的元素必须是一个在可接受范围内的数字
@Email 被注释的元素必须是一个邮箱
@Future(java.util.Date/Calendar) 被注释的元素必须是一个日期,其值必须大于当前时间
@FutureOrPresent(java.util.Date/Calendar) 被注释的元素必须是一个日期,其值必须大于等于当前时间
@Max(value) 被注释的元素其值必须小于等于指定的最大值
@Min(value) 被注释的元素其值必须大于等于指定的最小值
@Negative 被注释的元素必须是一个严格的负数(0为无效值)
@NegativeOrZero 被注释的元素必须是一个严格的负数(包含0)
@NotBlank 被注释的元素必须是一个不为空的字符
@NotEmpty 被注释的元素必须是一个不为空的值
@NotNull 被注释的元素必须不为Null
@Null 被注释的元素必须为Null
@Past(java.util.Date/Calendar) 被注释的元素必须是一个日期,其值必须小于当前时间
@PastOrPresent(java.util.Date/Calendar) 被注释的元素必须是一个日期,其值必须小于等于当前时间
@Pattern(regex=, flag=) 被注释的元素必须符合指定的正则表达式
@Positive 被注释的元素必须严格的正数(0为无效值)
@PositiveOrZero 被注释的元素必须严格的正数(包含0)
@Size(min=, max=) 被注释的元素大小必须介于指定边界(包括)之间

@NotEmpty

不能是Null,不能是空字符,集合框架中的元素不能为空

加了@NotEmpty注解的String类 ,Collection集合,Map ,数组,这些是不能为Null或者长度为 0 的(String, Collection, MapisEmpty()方法)

@NotNull

主要用在基本数据类型上(Int,Integer,Double)等,被修饰元素不能为Null

@Null

@NotNull相反,被修饰元素只能为Null

@NotBlank

主要用在String字符串上面,只能用于字符串不为Null,并且字符串trim()以后length要大于 0,必须包含至少一个非空白字符,这个注解用来判断字符串或者字符

@Max(value)

BigDecimal, BigInteger, byte, short, int, long 等任何NumberCharSequence(存储的是数字)子类型,验证注解的元素值小于等于@Max指定的value

@Min(value)

BigDecimal, BigInteger, byte, short, int, long 等任何NumberCharSequence(存储的是数字)子类型,验证注解的元素值大于等于@Min指定的value

@Size(min=, max=)

数据类型: String, Collection, Map and arrays

@Pattern(regex=, flag=)

检查该字符串是否能够在 match 指定的情况下被 regex 定义的正则表达式匹配

/** 类型 **/
@Pattern(message = "只能传JSAPI,WXAPP,NJSAPI", regexp = "^JSAPI$|^WXAPP$|^NJSAPI$", groups = {PayUrlValidator.class})
private String type;

# 2. 使用

简单使用,系统捕获抛出检验异常即可

# 2.1. 工具类

import org.hibernate.validator.HibernateValidator;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;

/**
 * ValidatorHelper
 *
 * @author wliduo[i@dolyw.com]
 * @date 2021/11/2 14:32
 */
public class ValidatorUtil {

    private static Validator validator;

    /**
     * Validator
     *
     * @author wliduo[i@dolyw.com]
     * @date 2021/11/2 14:35
     */
    static {
        // 关闭快速模式,默认全部校验,快速模式打开校验到一个不通过数据会直接返回
        validator = Validation.byProvider(HibernateValidator.class).configure()
                .failFast(false).buildValidatorFactory().getValidator();
    }

    /**
     * 检验方法
     *
     * @param object 对象
     * @param classes 检验分组
     * @return void
     * @throws
     * @author wliduo[i@dolyw.com]
     * @date 2021/11/2 14:37
     */
    public static void validate(Object object, Class... classes) {
        Set<ConstraintViolation<Object>> result = validator.validate(object, classes);
        if (result.size() > 0) {
            StringBuffer errorMsg = new StringBuffer("");
            for (ConstraintViolation constraintViolation : result) {
                errorMsg.append(constraintViolation.getMessageTemplate()).append("-");
                errorMsg.append(constraintViolation.getPropertyPath()).append(";");
            }
            throw new ValidParamException(errorMsg.toString());
        }
    }

    /**
     * 检验方法返回错误信息
     *
     * @param object 对象
     * @param classes 检验分组
     * @return void
     * @throws
     * @author wliduo[i@dolyw.com]
     * @date 2021/11/2 14:37
     */
    public static String validateAndResult(Object object, Class... classes) {
        Set<ConstraintViolation<Object>> result = validator.validate(object, classes);
        if (result.size() > 0) {
            StringBuffer errorMsg = new StringBuffer();
            for (ConstraintViolation constraintViolation : result) {
                errorMsg.append(constraintViolation.getMessageTemplate()).append("-");
                errorMsg.append(constraintViolation.getPropertyPath()).append(";");
            }
            return errorMsg.toString();
        }
        return "";
    }
}

# 2.2. 嵌套校验

如果一个实体是嵌套的实体,必须给其加上 @Valid 注解才会去执行校验下级的实体内的注释,如下,如果没加 @Valid修饰,则 XXXShippingDto 里的注解不会生效,对于 List<XXXDto> 也是一样,添加 @Valid修饰后,就会去执行 XXXDto 里的注解校验,当然,会按照校验分组执行

public class XXXReq {

  @Valid
  private XXXInfoDto xxxInfoDto;

  private XXXShippingDto xxxShippingDto;
  
  @Valid
  private List<XXXDto> xxxList;
    
}

# 2.3. 代码示例

创建校验分组

/**
 * 校验分组
 *
 * @author wliduo[i@dolyw.com]
 * @date 2021/11/2 11:43
 */
public interface XXXValidator {
}

在实体添加检验注释及对应生效的分组

public class XXXReq {
 
	/** 订单号 **/
	@NotBlank(message = "订单号不能为空", groups = { XXXValidator.class })
  private String orderCode;
    
}

代码执行,参数为校验的实体及检验的分组,当然也可以同时执行多个分组

// 前置数据校验
ValidatorUtil.validate(requestMessage, CreateOrderValidator.class);
ValidatorUtil.validate(requestMessage, OrderToPolicyValidator.class);
ValidatorUtil.validate(requestMessage, RequestMessageValidator.class, OrderToPolicyValidator.class);

参考

上次更新时间: 2023-12-15 03:14:55