import org.springframework.util.CollectionUtils;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.groups.Default;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* @program: 参数检验工具
* @description: hibernate validator手动验证工具类,效果相当于springMVC中的@valid,此工具为手动验证工具类
* @author: moodincode
* @create: 2020/12/25
**/
public final class HibernateValidationUtil {
/**
* 调用hibernate validator进行对象字段规则验证
*/
private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
private HibernateValidationUtil() {
}
/**
* 验证对象
* @param obj
* @param <T>
* @return
*/
public static <T> ValidationResult validateEntity(T obj) {
if (obj == null) {
Map<String, String> errorMsg = new HashMap<>(1);
errorMsg.put("验证对象", "不能为空");
return new ValidationResult(true, errorMsg, "验证对象不能为空");
}
return handlerValidResult(validator.validate(obj, Default.class), null);
}
/**
* 验证对象某个属性名
* @param obj
* @param propertyName 属性名,如果是字段中对象里面的字段,则需要对象字段名.对象对应的字段,例如 soreInfo.english
* @param <T>
* @return
*/
public static <T> ValidationResult validateProperty(T obj, String propertyName) {
if (obj == null) {
Map<String, String> errorMsg = new HashMap<>(1);
errorMsg.put("验证对象", "不能为空");
return new ValidationResult(true, errorMsg, "验证对象不能为空");
}
return handlerValidResult(validator.validateProperty(obj, propertyName, Default.class), propertyName);
}
public static <T> ValidationResult handlerValidResult(Set<ConstraintViolation<T>> resultSet, String propertyName) {
ValidationResult result = new ValidationResult();
if (!CollectionUtils.isEmpty(resultSet)) {
result.setHasErrors(true);
Map<String, String> errorMsg = new HashMap<>(16);
boolean isNotAddToFirst = true;
for (ConstraintViolation<T> cv : resultSet) {
if (isNotAddToFirst) {
if (cv.getMessageTemplate().equals(cv.getMessage())) {
result.setFirstErrorMsg(cv.getMessage());
} else {
result.setFirstErrorMsg((propertyName == null ? cv.getPropertyPath().toString() : propertyName)
+ cv.getMessage());
}
isNotAddToFirst = false;
}
errorMsg.put(propertyName == null ? cv.getPropertyPath().toString() : propertyName, cv.getMessage());
}
result.setErrorMsg(errorMsg);
} else {
result.setHasErrors(false);
}
return result;
}
public static Validator getValidator() {
return validator;
}
public static void setValidator(Validator validator) {
HibernateValidationUtil.validator = validator;
}
public static class ValidationResult {
/**
* 是否有错误
*/
private Boolean hasErrors;
/**
* 错误信息集合
*/
private Map<String, String> errorMsg;
/**
* 第一条触发错误的信息
*/
private String firstErrorMsg;
public ValidationResult() {
}
public ValidationResult(Boolean hasErrors, Map<String, String> errorMsg, String firstErrorMsg) {
this.hasErrors = hasErrors;
this.errorMsg = errorMsg;
this.firstErrorMsg = firstErrorMsg;
}
public Boolean getHasErrors() {
return hasErrors;
}
public void setHasErrors(Boolean hasErrors) {
this.hasErrors = hasErrors;
}
public Map<String, String> getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(Map<String, String> errorMsg) {
this.errorMsg = errorMsg;
}
public String getFirstErrorMsg() {
return firstErrorMsg;
}
public void setFirstErrorMsg(String firstErrorMsg) {
this.firstErrorMsg = firstErrorMsg;
}
}
}
需要引用hibernate-validator依赖,配合hibernate的注解进行校验,主要用于不依赖直接抛出异常的场景,或者自定义抛出异常的场景,例如根据不同业务类型,将json字符串转对象后,校验数据是否正常,或者读取excel数据后,校验格式等场景
版权声明:本文为qq_24577585原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。