package com.tellhow.fztb.common.util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import java.util.Set;
/**
* 数据校验相关相关工具
*
* @author seliote
* @since 2020/1/17
*/
@SuppressWarnings("unused")
@Component
public class ValidationUtil {
private static Validator sValidator;
// 注入校验器并转为 static 域
@Autowired
public ValidationUtil(Validator validator) {
sValidator = validator;
}
/**
* 获取数据 JSR 303 校验结果集合
*
* @param pojo 需要校验的数据,不可为 null
* @param <T> 数据类型
* @return 校验结果集合
*/
public static <T> Set<ConstraintViolation<T>> getConstraintViolation(T pojo) {
// 参数是 null 直接校验会导致 IllegalArgumentException: HV000116
return sValidator.validate(pojo);
}
/**
* 获取数据 JSR 303 校验结果字符串描述
*
* @param pojo 需要校验的数据,不可为 null
* @param <T> 数据类型
* @return 校验正确时返回 null,失败时返回对应校验结果字符串描述
*/
public static <T> String getValidationMsg(T pojo) {
// 两个校验结果之间的分隔符
final String separator = ", ";
StringBuilder stringBuilder = new StringBuilder();
// 生成字符串
for (ConstraintViolation<T> violation : getConstraintViolation(pojo)) {
// 没有类限定,直接返回域名
stringBuilder.append(violation.getPropertyPath().toString())
.append(": ")
.append(violation.getMessage())
.append(separator);
}
// 参数校验正确返回 null
if (stringBuilder.length() <= 0) {
return null;
} else {
// 删掉末尾的
int length = stringBuilder.length();
stringBuilder.delete(length - separator.length(), length);
}
return stringBuilder.toString();
}
/**
* 校验数据是否符合 JSR 303 规范
*
* @param pojo 需要校验的数据,不可为 null
* @param <T> 数据类型
* @return 符合返回 true, 否则返回 false
*/
public static <T> boolean isLegal(T pojo) {
return getConstraintViolation(pojo).size() <= 0;
}
}