我有一个基本的弹簧支架控制器,并且有一个公司要求,该要求需要在一个合并的日志消息中记录请求和响应。我计划从一些简单的方面做到这一点。
但是,控制器调用了服务,该服务又呼出另一个第三方api,并且要求将上述第三方调用花费的时间包括在上述控制器输出的日志中。
我想知道这是否可以通过方面实现?我想它将需要一个@Around方面的主控制器,然后另一个@Around的下游api调用和某种方式将内部方面的结果注入到建议或外部方面。不确定是否可以做到?也许是通过方面传递的请求范围的bean?
谢谢
关于班级日志如何
public class Log {
private long start;
private long end;
public long getStart() {
return start;
}
public void setStart(long start) {
this.start = start;
}
public long getEnd() {
return end;
}
public void setEnd(long end) {
this.end = end;
}
@Override
public String toString() {
return "Log [start=" + start + ", end=" + end + "]";
}
并通过api调用传递此对象的实例。
说BeanOne.methodOne(Log,..)-> BeanTwo.methodTwo(Log,..)。 BeanTwo.methodTwo()调用外部api,时间记录在Log实例中。
和如下建议
@Around("execution(* methodOne(..)) && args(log)")
public void testAdviceBeanOne(ProceedingJoinPoint pjp,Log log) {
System.out.println("Before methodOne()");
try {
System.out.println(log);
pjp.proceed();
System.out.println(log);
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("After methodOne()");
}
给出输出
Before methodOne()
Log [start=0, end=0]
Log [start=1572408716134, end=1572408716136]
After methodOne()
可能会有一个更优雅的解决方案,仍然是我的两分钱