Spring AOP 自定义注解获取http接口及WebService接口入参和出参
1.定义两个方法注解,分别标记要处理的http接口及Webservice接口:
http接口注解
@Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.TYPE, ElementType.METHOD }) public @interface AnnotationForIntfMark { String value(); }
WebService接口注解
@Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.TYPE, ElementType.METHOD }) public @interface AnnotationForWsMark { String value(); }
2.定义Spring AOP切入点,两种接口注解切入点,注意 中间用||,网上也有说明使用or,试过之后发现or后面的切入点无效
@Pointcut("@annotation(ms.platform.base.interfaces.AnnotationForIntfMark) || @annotation(ms.platform.base.interfaces.AnnotationForWsMark)") public void pointcut() { }
3.环绕式加入切入点
@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("\n"); Object retVal = joinPoint.proceed(); String respParam = postHandle(retVal); sb.append("Output Param:【").append(respParam).append("】").append("\n"); MSLog.error(sb.toString()); }
4.preHandle(joinPoint)获取接口入参,postHandle(retVal)获取接口出参
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(); }
private String postHandle(Object retVal) { return JsonUtil.bean2json(retVal); }
5.切面类定义,注意需要添加@Component,否则将扫描不到切面类
@Aspect @Component public class WebRequestAroundAdvice { }