zoukankan      html  css  js  c++  java
  • Spring AOP 自定义注解获取http接口及WebService接口入参和出参

    注解方法实现过程中可以采用如下获取方式:—以下为例

     HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

    1.定义两个方法注解,分别标记要处理的http接口及Webservice接口:

    http接口注解

    1
    2
    3
    4
    5
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ ElementType.TYPE, ElementType.METHOD })
    public @interface AnnotationForIntfMark {
        String value();
    }

    WebService接口注解

    1
    2
    3
    4
    5
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ ElementType.TYPE, ElementType.METHOD })
    public @interface AnnotationForWsMark {
        String value();
    }

    2.定义Spring AOP切入点,两种接口注解切入点,注意 中间用||,网上也有说明使用or,试过之后发现or后面的切入点无效

    1
    2
    3
    @Pointcut("@annotation(ms.platform.base.interfaces.AnnotationForIntfMark) || @annotation(ms.platform.base.interfaces.AnnotationForWsMark)")
        public void pointcut() {
        }

    3.环绕式加入切入点

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Around("pointcut()")
        public void handle(ProceedingJoinPoint joinPoint) throws Throwable {
            StringBuffer sb = new StringBuffer();
            String reqParam = preHandle(joinPoint);
            sb.append("Input Param:【").append(reqParam).append("】").append(" ");
            Object retVal = joinPoint.proceed();
            String respParam = postHandle(retVal);
            sb.append("Output Param:【").append(respParam).append("】").append(" ");
            MSLog.error(sb.toString());
        }

    4.preHandle(joinPoint)获取接口入参,postHandle(retVal)获取接口出参

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    private String preHandle(ProceedingJoinPoint joinPoint) {
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
                    .getRequest();
            Signature signature = joinPoint.getSignature();
            MethodSignature methodSignature = (MethodSignature) signature;
            Method targetMethod = methodSignature.getMethod();
            Annotation[] annotations = targetMethod.getAnnotations();
            boolean isIntf = false;
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < annotations.length; i++) {
                if (annotations[i].annotationType().equals(AnnotationForIntfMark.class)) {
                    sb.append(request.getAttribute("jsonContent"));
                    isIntf = true;
                    break;
                }
            }
            if (!isIntf) {
                Object[] args = joinPoint.getArgs();
                for (int j = 0; j < args.length; j++) {
                    sb.append(JsonUtil.bean2json(args[j]));
                }
            }
            return sb.toString();
        }
    1
    2
    3
    private String postHandle(Object retVal) {
            return JsonUtil.bean2json(retVal);
        }
    1
     

    5.切面类定义,注意需要添加@Component,否则将扫描不到切面类

    1
    2
    3
    4
    5
    @Aspect
    @Component
    public class WebRequestAroundAdvice {
     
    }
  • 相关阅读:
    flask框架+上传文件接口实战【软件测试培训】【多测师_王sir】
    读取Excel中的视频文件地址+requests库下载后存入本地文件夹【软件测试培训】【多测师_王sir】
    UI和接口自动化中的设计模式:单例模式【软件测试培训】【多测师_王sir】
    Python+BeautifulReport生成完美的接口自动化测试报告【多测师_王sir】
    Linux命令中查找以.log结尾文件中不包含某个特定字符串这行的内容【多测师_王sir】
    查询多条数据
    django登录装饰接口封装
    django使用redis作为session缓存
    tinymce配置
    django重写authcenticate方法兼容用户、邮箱、密码认证登录
  • 原文地址:https://www.cnblogs.com/fan-yuan/p/9054662.html
Copyright © 2011-2022 走看看