
com.github.kaizen4j.util.ValidationUtils Maven / Gradle / Ivy
package com.github.kaizen4j.util;
import com.google.common.collect.Lists;
import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.executable.ExecutableValidator;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.hibernate.validator.HibernateValidator;
/**
* 实体 Bean 验证工具类
*
* @author liuguowen
*/
public final class ValidationUtils {
private static Validator validator = Validation.byProvider(HibernateValidator.class).configure().failFast(true)
.buildValidatorFactory().getValidator();
private ValidationUtils() {
}
/**
* 验证对象
*
* @param t 对象
* @param groups 检验分组
* @param 对象类型
* @return List
*/
public static List validate(T t, Class>... groups) {
List validationMessages = Lists.newArrayList();
Set> violations = validator.validate(t, groups);
if (CollectionUtils.isNotEmpty(violations)) {
for (ConstraintViolation violation : violations) {
validationMessages
.add(new ValidationMessage(violation.getPropertyPath().toString(), violation.getMessage()));
}
}
return validationMessages;
}
/**
* 验证对象,快速失败则抛出 IllegalArgumentException
*
* @param t 对象
* @param groups 检验分组
* @param 对象类型
*/
public static void validateFailFast(T t, Class>... groups) {
List validationMessages = validate(t, groups);
if (CollectionUtils.isNotEmpty(validationMessages)) {
throw new IllegalArgumentException(JsonUtils.toJson(validationMessages));
}
}
/**
* 验证对象构造函数参数
*
* @param objectClass 对象 Class 类型
* @param constructorParams 构造函数参数数组
* @param parameterTypes 构造函数参数类型数组
* @param 对象类型
*/
public static void validateConstructorFailFast(Class objectClass, Object[] constructorParams,
Class>... parameterTypes) {
Constructor constructor;
try {
constructor = objectClass.getConstructor(parameterTypes);
} catch (Exception e) {
throw new RuntimeException(e);
}
ExecutableValidator executableValidator = validator.forExecutables();
Set> violations = executableValidator
.validateConstructorParameters(constructor, constructorParams);
if (CollectionUtils.isNotEmpty(violations)) {
List validationMessages = violations.stream()
.map(violation -> new ValidationMessage(violation.getPropertyPath().toString(),
violation.getMessage())).collect(Collectors.toList());
throw new IllegalArgumentException(JsonUtils.toJson(validationMessages));
}
}
public static class ValidationMessage implements Serializable {
private static final long serialVersionUID = 295947517110553238L;
private String field;
private String msg;
public ValidationMessage(String field, String msg) {
this.field = field;
this.msg = msg;
}
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy