package com.chuanghai.h3c_reporting.aop; import com.chuanghai.h3c_reporting.anno.ParamCheck; import com.chuanghai.h3c_reporting.common.exception.BizCodeEnume; import com.chuanghai.h3c_reporting.common.exception.RRException; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.reflect.MethodSignature; import org.hibernate.validator.HibernateValidator; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Set; /** * 参数校验切面 */ @Aspect @Component @Order(1) public class ParamCheckAspect { /** * 校验器 */ private Validator validator = Validation.byProvider(HibernateValidator.class) .configure() .failFast(true) // 快速失败模式 .buildValidatorFactory() .getValidator(); @Around("@annotation(com.chuanghai.h3c_reporting.anno.ParamCheck)") public Object paramCheck(ProceedingJoinPoint point) throws Throwable { Signature signature = point.getSignature(); MethodSignature methodSignature = (MethodSignature) signature; Method method = methodSignature.getMethod(); // 参数列表 Object[] args = point.getArgs(); ParamCheck paramCheck = method.getAnnotation(ParamCheck.class); // 需要校验参数索引【从1开始】 int[] index = paramCheck.index(); if (args == null) { throw new RRException(BizCodeEnume.UNKNOW_EXCEPTION, "@ParamCheck标注在参数列表为空的方法上"); } int maxIndex = Arrays.stream(index).max().getAsInt(); if (maxIndex > args.length) { throw new RRException(BizCodeEnume.UNKNOW_EXCEPTION, "@ParamCheck index越界"); } for (int i: index) { Object value = args[i - 1]; if (value.getClass().isArray()) { doValidate(Arrays.asList((Object[]) value)); } else if (value instanceof List) { doValidate((List) value); } else if (value instanceof Set) { doValidate(new ArrayList((Set) value)); } else { doValidate(value); } } // 返回执行结果 return point.proceed(); } public void doValidate(List values) { if (values != null && values.size() > 0) { for (Object o: values) { doValidate(o); } } } public void doValidate(Object o) { Set> errorSet = validator.validate(o); if (errorSet != null && errorSet.size() > 0) { throw new RRException(BizCodeEnume.PARAMETER_ERROR, errorSet.iterator().next().getMessage()); } } }