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

org.rx.util.Validator Maven / Gradle / Ivy

There is a newer version: 3.0.0
Show newest version
package org.rx.util;

import lombok.SneakyThrows;

import javax.validation.*;
import javax.validation.executable.ExecutableValidator;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

import org.rx.annotation.ValidRegex;
import org.rx.core.NQuery;
import org.rx.util.function.Func;

import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;

/**
 * http://www.cnblogs.com/pixy/p/5306567.html
 */
public class Validator {
    public static class RegexValidator implements ConstraintValidator {
        private ValidRegex validRegex;

        @Override
        public void initialize(ValidRegex validRegex) {
            this.validRegex = validRegex;
        }

        @Override
        public boolean isValid(String s, ConstraintValidatorContext context) {
            if (s == null) {
                return true;
            }

            Pattern p = Pattern.compile(validRegex.value().getRegexp(), Pattern.CASE_INSENSITIVE);
            return p.matcher(s).matches();
        }
    }

    private static javax.validation.Validator getValidator() {
        return Validation.buildDefaultValidatorFactory().getValidator();
    }

    /**
     * 验证bean实体 @Valid deep valid
     *
     * @param bean
     */
    public static void validateBean(Object bean) {
        List list = NQuery.asList(bean, false);
        if (list.isEmpty()) {
            list.add(bean);
        }
        javax.validation.Validator validator = getValidator();
        for (Object b : list) {
            for (ConstraintViolation violation : validator.validate(b)) {
                doThrow(violation);
            }
        }
    }

    private static void doThrow(ConstraintViolation violation) {
        String pn = violation.getPropertyPath().toString(), vm = violation.getMessage();
        throw new ValidateException(pn, vm, String.format("%s.%s %s", violation.getRootBeanClass().getSimpleName(), pn, vm));
    }

    public static void validateConstructor(Constructor member, Object instance, Object[] parameterValues) {
        ExecutableValidator executableValidator = getValidator().forExecutables();
        Set> result = executableValidator.validateConstructorParameters(member, parameterValues);
        for (ConstraintViolation violation : result) {
            doThrow(violation);
        }

        executableValidator.validateConstructorReturnValue(member, instance);
    }

    @SneakyThrows
    public static Object validateMethod(Method member, Object instance, Object[] parameterValues, Func proceed) {
        ExecutableValidator executableValidator = getValidator().forExecutables();
        //@Valid deep validateValues
        for (ConstraintViolation violation : executableValidator.validateParameters(instance, member, parameterValues)) {
            doThrow(violation);
        }

        if (proceed == null) {
            return null;
        }
        Object retVal;
        for (ConstraintViolation violation : executableValidator.validateReturnValue(instance, member, retVal = proceed.invoke())) {
            doThrow(violation);
        }
        return retVal;
    }
}