0

我有一个基本的弹簧休息控制器,并且有一个公司要求,需要在一个组合日志消息中记录请求和响应。我计划用一些简单的方面来做这件事。

然而,控制器调用一个服务,该服务又调用另一个第三方 api,并且需要将这个第三方调用所花费的时间包含在上述控制器的日志输出中。

我想知道这是否可以通过方面来实现?我想它需要一个 @Around 方面用于主控制器,然后另一个@Around 用于下游 api 调用,以及某种将内部方面的结果注入到建议或外部方面的方法。不知道这能不能做到??或者也许是通过方面传递的请求范围的bean?

谢谢

4

1 回答 1

0

上课日志怎么样

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()

可能有一个更优雅的解决方案,仍然是我的两分钱

于 2019-10-30T04:14:37.017 回答