# 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=) | 被注释的元素必须是一个在可接受范围内的数字 |
被注释的元素必须是一个邮箱 | |
@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, Map
的isEmpty()
方法)
@NotNull
主要用在基本数据类型上(Int,Integer,Double
)等,被修饰元素不能为Null
@Null
和 @NotNull
相反,被修饰元素只能为Null
@NotBlank
主要用在String
字符串上面,只能用于字符串不为Null
,并且字符串trim()
以后length
要大于 0,必须包含至少一个非空白字符,这个注解用来判断字符串或者字符
@Max(value)
BigDecimal, BigInteger, byte, short, int, long
等任何Number
或CharSequence
(存储的是数字)子类型,验证注解的元素值小于等于@Max
指定的value
值
@Min(value)
BigDecimal, BigInteger, byte, short, int, long
等任何Number
或CharSequence
(存储的是数字)子类型,验证注解的元素值大于等于@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);
参考