| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- 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<ConstraintViolation<Object>> errorSet = validator.validate(o);
- if (errorSet != null && errorSet.size() > 0) {
- throw new RRException(BizCodeEnume.PARAMETER_ERROR, errorSet.iterator().next().getMessage());
- }
- }
- }
|