• 通过aop实现rpc统一参数校验&异常捕捉


    api rpc 统一参数校验和异常拦截

    hibernate validator工具类 
    public class ValidatorUtils {
        private ValidatorUtils() {
        }
    
        private static Validator validator;
    
        public static <T> void validate(T obj) {
            Set<ConstraintViolation<T>> constraintViolations = getValidator().validate(obj);
            if (CollectionUtils.isEmpty(constraintViolations)) {
                return;
            }
            StringBuffer paramMsg = new StringBuffer();
            constraintViolations.forEach(violation -> paramMsg.append(violation.getMessage()).append(";"));
            throw new ParamInvalidException(paramMsg.toString());
        }
    
        private static Validator getValidator() {
            if (Objects.isNull(validator)) {
                ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
                validator = validatorFactory.getValidator();
            }
            return validator;
        }
    
    }

    切面

    @Aspect
    @Component
    @Slf4j
    public class ServiceAspect {
    
        @Pointcut("execution(public com.xxx.rpc.share.base.ResponseDTO *(..))")
        public void exeMethod() {
        }
    
        @Around("exeMethod()")
        public <T> ResponseDTO<T> around(ProceedingJoinPoint pjp) {
            Object[] params = pjp.getArgs();
            try {
                // 入参校验
                this.paramValidate(params);
                Object proceed = pjp.proceed();
                String methodName = pjp.getSignature().getName();
                if (Objects.isNull(proceed)) {
                    log.error("服务接口【{}】返回空,请求参数:{}", methodName, Arrays.toString(params));
                    throw new NullPointerException("服务返回结果为空");
                }
                return (ResponseDTO<T>) proceed;
            } catch (Throwable t) {
                return handleException(t);
            }
        }
    
        private void paramValidate(Object[] params) {
            if (ArrayUtils.isEmpty(params)) {
                return;
            }
            Stream.of(params).forEach(param -> {
                if (Objects.isNull(param)) {
                    throw new ParamInvalidException("传入参数为空!");
                }
                ValidatorUtils.validate(param);
            });
        }
    
        private <T> ResponseDTO<T> handleException(Throwable t) {
            ResponseDTO<T> responseDTO = new ResponseDTO<>();
            if (t instanceof ParamInvalidException) {
                responseDTO.setResult(ResponseCode.ILLPARAM, t.getMessage());
            } else {
                log.error("系统异常:{}", t);
                responseDTO.setResult(ResponseCode.EXCEPTION, t.getMessage());
            }
            return responseDTO;
        }

    依赖jar

        <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.16.18</version>
                <!--<scope>provided</scope>-->
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-validator</artifactId>
                <version>5.3.5.Final</version>
            </dependency>
            <dependency>
                <groupId>javax.el</groupId>
                <artifactId>el-api</artifactId>
                <version>2.2</version>
            </dependency>
            <dependency>
                <groupId>org.glassfish.web</groupId>
                <artifactId>javax.el</artifactId>
                <version>2.2.6</version>
            </dependency>
  • 相关阅读:
    seajs加载angularjs
    seajs加载jquery提示$ is not a function
    java 动态代理
    C#第三章--对象和类
    Android笔记--两种双击退出程序的方法
    Android--Volley基本用法及自定义
    Win10专业版只要12.99元?应用商店Bug福利也算数
    新人报道
    排序

  • 原文地址:https://www.cnblogs.com/xlh91118/p/7699657.html
Copyright © 2020-2023  润新知