All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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