ParamCheckAspect.java 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package com.chuanghai.h3c_reporting.aop;
  2. import com.chuanghai.h3c_reporting.anno.ParamCheck;
  3. import com.chuanghai.h3c_reporting.common.exception.BizCodeEnume;
  4. import com.chuanghai.h3c_reporting.common.exception.RRException;
  5. import org.aspectj.lang.ProceedingJoinPoint;
  6. import org.aspectj.lang.Signature;
  7. import org.aspectj.lang.annotation.Around;
  8. import org.aspectj.lang.annotation.Aspect;
  9. import org.aspectj.lang.reflect.MethodSignature;
  10. import org.hibernate.validator.HibernateValidator;
  11. import org.springframework.core.annotation.Order;
  12. import org.springframework.stereotype.Component;
  13. import javax.validation.ConstraintViolation;
  14. import javax.validation.Validation;
  15. import javax.validation.Validator;
  16. import java.lang.reflect.Method;
  17. import java.util.ArrayList;
  18. import java.util.Arrays;
  19. import java.util.List;
  20. import java.util.Set;
  21. /**
  22. * 参数校验切面
  23. */
  24. @Aspect
  25. @Component
  26. @Order(1)
  27. public class ParamCheckAspect {
  28. /**
  29. * 校验器
  30. */
  31. private Validator validator = Validation.byProvider(HibernateValidator.class)
  32. .configure()
  33. .failFast(true) // 快速失败模式
  34. .buildValidatorFactory()
  35. .getValidator();
  36. @Around("@annotation(com.chuanghai.h3c_reporting.anno.ParamCheck)")
  37. public Object paramCheck(ProceedingJoinPoint point) throws Throwable {
  38. Signature signature = point.getSignature();
  39. MethodSignature methodSignature = (MethodSignature) signature;
  40. Method method = methodSignature.getMethod();
  41. // 参数列表
  42. Object[] args = point.getArgs();
  43. ParamCheck paramCheck = method.getAnnotation(ParamCheck.class);
  44. // 需要校验参数索引【从1开始】
  45. int[] index = paramCheck.index();
  46. if (args == null) {
  47. throw new RRException(BizCodeEnume.UNKNOW_EXCEPTION, "@ParamCheck标注在参数列表为空的方法上");
  48. }
  49. int maxIndex = Arrays.stream(index).max().getAsInt();
  50. if (maxIndex > args.length) {
  51. throw new RRException(BizCodeEnume.UNKNOW_EXCEPTION, "@ParamCheck index越界");
  52. }
  53. for (int i: index) {
  54. Object value = args[i - 1];
  55. if (value.getClass().isArray()) {
  56. doValidate(Arrays.asList((Object[]) value));
  57. } else if (value instanceof List) {
  58. doValidate((List) value);
  59. } else if (value instanceof Set) {
  60. doValidate(new ArrayList((Set) value));
  61. } else {
  62. doValidate(value);
  63. }
  64. }
  65. // 返回执行结果
  66. return point.proceed();
  67. }
  68. public void doValidate(List values) {
  69. if (values != null && values.size() > 0) {
  70. for (Object o: values) {
  71. doValidate(o);
  72. }
  73. }
  74. }
  75. public void doValidate(Object o) {
  76. Set<ConstraintViolation<Object>> errorSet = validator.validate(o);
  77. if (errorSet != null && errorSet.size() > 0) {
  78. throw new RRException(BizCodeEnume.PARAMETER_ERROR, errorSet.iterator().next().getMessage());
  79. }
  80. }
  81. }