【问题标题】:Aspectj pointcut not working with spring @Recover method in spring boot 2Aspectj 切入点不适用于 Spring Boot 2 中的 Spring @Recover 方法
【发布时间】:2019-10-25 17:47:37
【问题描述】:

我在 spring boot 2.1.1 中使用 aop,我有切入点并建议记录调用并返回使用自定义注释 @LogAround 注释的方法的值

@Pointcut("@annotation(x.y.z.LogAround)")
public void logAroundJoinPoint() {}

@Before("logAroundJoinPoint()")
public void logBefore(JoinPoint joinPoint) {
// logging code
}

@AfterReturning(
          pointcut = "logAroundJoinPoint()",
          returning= "result")
     public void logAfterReturning(JoinPoint joinPoint, Object result) {
    //some logging code

     }

对于使用@LogAround 注释的方法,此代码按预期记录方法调用除非我在使用@Recover 注释的方法上使用以进行春季重试!

我不知道为什么会这样。

一种选择是使用恢复方法进行简单的日志记录,但如果有办法使这项工作正常进行,我更愿意。任何帮助表示赞赏。

我在git_demo_code有设置演示代码

【问题讨论】:

    标签: spring spring-boot spring-aop spring-retry


    【解决方案1】:

    两条建议的precedence 级别可能存在冲突(相同)。使用@Order 明确说明应首先应用哪些建议。通过将方面的顺序设置为更低或更高来调整顺序,例如将值设置为LOWEST_PRECEDENCEHIGHEST_PRECEDENCE

    @Order(Ordered.HIGHEST_PRECEDENCE)
    @Aspect
    public class YourAspect {
        ...
    }
    

    【讨论】:

    • 感谢您的回复,但它似乎不起作用:Ordered.HIGHEST_PRECEDENCE 将导致 http 请求失败 - “java.lang.IllegalStateException: No MethodInvocation found..advices with order HIGHEST_PRECEDENCE 将在之前执行ExposeInvocationInterceptor!”。如果我添加 @Oder、Ordered.HIGHEST_PRECEDENCE+1 或任何更大的值,例如 +2、10 或 Ordered.LOWEST_PRECEDENCE、LOWEST_PRECEDENCE - 1、2、10,都无法解决问题。此外,@Retryable 方法的日志记录也失败了..!,如果方面类上不存在@Order,则@Retryable 的日志记录工作正常。
    • 另外,在logAfterReturning()上加@Order好像一点效果都没有!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2015-02-10
    相关资源
    最近更新 更多