- 增加maven依赖
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.17.Final</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
- 使用的工具类
package com.internet.fin.utils;
import com.google.common.collect.Lists;
import org.apache.commons.collections.CollectionUtils;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* @Description: Hibernate Validator 注解解析
* @Date: 2021/11/10 10:20
*/
public class HibernateValidatorUtils {
private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
/**
* @param t 要校验的bean
* @Description: 参数校验,返回所有有的错误信息
* @Date: 2021/11/10 10:20
*/
public static <T> List<String> validate(T t) {
Set<ConstraintViolation<T>> constraintViolations = validator.validate(t);
if (CollectionUtils.isEmpty(constraintViolations)) {
return Lists.newArrayList();
}
List<String> messageList = constraintViolations.stream().map(ConstraintViolation::getMessage).collect(Collectors.toList());
return messageList;
}
/**
* @param t 要校验的bean
* @Description: 参数校验,返回第一个错误的信息
* 注意该方法不是真正的failFast
* 真正的配置如下:
* Validatoion validation = Validation.byProvider(HibernateValidator.class).configure()
* .failFast(true).buildValidatorFactory();
* @Date: 2021/11/10 10:20
*/
public static <T> String validateFailFast(T t) {
Set<ConstraintViolation<T>> constraintViolations = validator.validate(t);
if (CollectionUtils.isEmpty(constraintViolations)) {
return null;
}
String message = constraintViolations.stream().findFirst().get().getMessage();
return message;
}
/**
* @param t 要校验的bean
* @param propertyName 属性名称
* @Description: 校验bean的某一个属性
* @Date: 2021/11/10 11:25
*/
public static <T> String validateProperty(T t, String propertyName) {
Set<ConstraintViolation<T>> violationSet = validator.validateProperty(t, propertyName);
if (CollectionUtils.isEmpty(violationSet)) {
return null;
}
for (ConstraintViolation<T> violation : violationSet) {
return violation.getMessage();
}
return null;
}
}
- 常用的校验方式
1)校验单个属性
/**
* 租户编码
*/
@NotBlank(message = "租户编码不能为空")
private String tenantCode;
2) 校验对象
/**
* 操作人信息
*/
@Valid
@NotNull(message = "操作人信息不能为空")
private ScmOperatorDTO scmOperator;
3) 校验数组中的对象
/**
* 银行账号列表
*/
@Valid
@NotEmpty(message = "银行账号列表不能为空")
private List<BankAccountDTO> bankAccounts;