spring 自定义参数校验

Spring bean校验

public abstract class GenericValidator {

    public abstract void validate(ProceedingJoinPoint pjp);

    protected  String errorHandler(Map<String,Object> errors) {
        return new JSONObject(errors).toString();
    }
}
public class BeanValidator extends GenericValidator{

    private static final Logger logger = LoggerFactory.getLogger(BeanValidator.class);

    private final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

    public void validate(ProceedingJoinPoint pjp) {
        Object[] objs = pjp.getArgs();
        for(int i = 0;i < objs.length;i++) {
            validator(objs[i],new Class<?>[0]);
        }
    }

    /**
     * @Description: 验证器
     * @param object 验证对象
     * @param groups    
     */
    protected <T> void validator(T object, Class<?>... groups) {
        Map<String,Object> errorMaps = new HashMap<String,Object>();

        Set<ConstraintViolation<T>> constraintViolationSet = validator.validate(object, groups);
        if(CollectionUtils.isNotEmpty(constraintViolationSet)) {
            for(Iterator<ConstraintViolation<T>> iterator = constraintViolationSet.iterator(); iterator.hasNext();) {
                ConstraintViolation<T> error = iterator.next();
                errorMaps.put(((PathImpl)error.getPropertyPath()).getLeafNode().getName(), error.getMessage());
            }
        }

        if(MapUtils.isNotEmpty(errorMaps)) {
            logger.debug("【validator】:参数校验结果"+errorMaps);
            throw new ParamException(errorHandler(errorMaps));
        }
    }
}

spring 方法级校验

public abstract class GenericValidator {

    public abstract void validate(ProceedingJoinPoint pjp);

    protected  String errorHandler(Map<String,Object> errors) {
        return new JSONObject(errors).toString();
    }
}
public class ParamValidator extends GenericValidator{

    private static final Logger logger = LoggerFactory.getLogger(ParamValidator.class);

    private final ExecutableValidator executableValidator = Validation.buildDefaultValidatorFactory()
            .getValidator().forExecutables();

    public void validate(ProceedingJoinPoint pjp) {

        Map<String,Object> errorMaps = new HashMap<String,Object>();

        Object object = pjp.getTarget();// 目标对象
        MethodSignature methodSignature = ((MethodSignature) pjp.getSignature());// 方法签名
        Object[] parameterValues = pjp.getArgs();// 参数
        Set<ConstraintViolation<Object>> constraintViolations = validator(object, 
                                                                                methodSignature.getMethod(), 
                                                                                parameterValues);
        if(CollectionUtils.isNotEmpty(constraintViolations)) {
            Iterator<ConstraintViolation<Object>> constraintViolationIterator = constraintViolations.iterator();
            while(constraintViolationIterator.hasNext()) {
                ConstraintViolation<Object> constraintViolation = constraintViolationIterator.next();
                errorMaps.put(getMethodParamName(methodSignature, constraintViolation), constraintViolation.getMessage());
            }
            if(MapUtils.isNotEmpty(errorMaps)) {
                logger.debug("【validator】:参数校验结果"+errorMaps);
                throw new ParamException(errorHandler(errorMaps));
            }
        } 
    }

    protected <T> Set<ConstraintViolation<T>> validator(T object,
               Method method,
               Object[] parameterValues,
               Class<?>... groups) {
        Set<ConstraintViolation<T>> set = executableValidator.validateParameters(object, 
                                                                            method, 
                                                                            parameterValues, 
                                                                            groups);
        return set;
    }
    protected <T> Set<ConstraintViolation<T>> validator(T object,
               Method method,
               Object[] parameterValues) {
        return validator(object, method, parameterValues, new Class<?>[0]);                                     
    }

    /**
     * 获得方法参数名称
     * @param methodSignature
     * @param constraintViolation
     * @return
     */
    private static String getMethodParamName(MethodSignature methodSignature,
            ConstraintViolation<Object> constraintViolation) {

        String[] parameterNames = methodSignature.getParameterNames();
        PathImpl pathImpl = (PathImpl) constraintViolation.getPropertyPath();  // 获得校验的参数路径信息
        int paramIndex = pathImpl.getLeafNode().getParameterIndex(); // 获得校验的参数位置

        if(parameterNames == null || parameterNames.length == 0 || parameterNames.length <= paramIndex) {
            return "";
        } else {
            return parameterNames[paramIndex];
        }
    }

}

框架整合

利用aop对方法进行拦截

@Component
@Aspect
public class ParamValidAspect {

    /*验证com.gz.controller及其子包中以update开头和insert开头的方法*/
    /*验证com.gz.controller及其子包中以BeanValid结尾的方法*/
    @Pointcut("execution(* com.gz.controller..*.insert* (..)) || execution(* com.gz.controller..*.update* (..)) || execution(* com.gz.controller..*.*BeanValid(..))")
    public void beanValidatorPointcut(){}

    /*验证com.gz.controller及其子包中以ParamValid结尾的方法*/
    @Pointcut("execution(* com.gz.controller..*.*ParamValid(..))")
    public void paramValidatorPointcut(){}

    @Around("beanValidatorPointcut()")
    public ResponseRel beanValidatorAdvice(ProceedingJoinPoint pjp) throws Throwable {
        GenericValidator validator = new BeanValidator();
        validator.validate(pjp);
        Object[] args = pjp.getArgs();
        Object result = pjp.proceed(args);
        return (ResponseRel)result;
    }

    @Around("paramValidatorPointcut()")
    public ResponseRel paramValidatorPointcut(ProceedingJoinPoint pjp) throws Throwable {
        GenericValidator validator = new ParamValidator();
        validator.validate(pjp);
        Object[] args = pjp.getArgs();
        Object result = pjp.proceed(args);
        return (ResponseRel)result;
    }
}

Spring validator参数校验
详情代码

猜你喜欢

转载自blog.csdn.net/u010811939/article/details/80390640