工作中用aspect打印了接口的出参、入参,踩了一些坑,故写出来记录一下
首先,要导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
然后是aspect类
@Slf4j
@Aspect
@Component
public class ParamLogAspect {
@Pointcut("execution(public * com.xxx.xx.*Controller.*.(..))")
public void paramLog() {}
// 方法一:用@Before + @AfterReturning
@Before("paramLog()")
public void before(JoinPoint point) {
String className = point.getTarget().getClass().getName();
String methodName = point.getSignature().getName();
Object[] args = point.getArgs();
log.info("{}.{}()方法的入参是:{}", className, methodName, JSONObject.toJSONString(args));
}
@AfterReturning(pointcut = "paramLog()", return = "res")
public void after(JoinPoint point, Object res) {
String className = point.getTarget().getClass().getName();
String methodName = point.getSignature().getName();
// 注意,如果这里的返回值类型是Iterator,那么他会不停的调用next()方法,去获取下一个值,此时应避免打印这种出参
log.info("{}.{}()方法的出参是:{}", className, methodName, JSONObject.toJSONString(res));
}
// 方法二:用@Around
@Around("paramLog()")
public Object around(ProceedingJoinPoint point) throws Throwable {
String className = point.getTarget().getClass().getName();
String methodName = point.getSignature().getName();
Object[] args = point.getArgs();
log.info("{}.{}()方法的入参是:{}", className, methodName, JSONObject.toJSONString(args));
Object res = point.proceed();
log.info("{}.{}()方法的出参是:{}", className, methodName, JSONObject.toJSONString(res));
// 一定要返回res!(踩过这个坑)
return res;
}
}