Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available, and ensure that AopContext.currentProxy() is invoked in the same thread as the AOP invocation context

alwaysmove / 2024-10-09 / 原文

这个错误通常发生在使用 Spring AOP 时,尤其是当你尝试访问 AopContext.currentProxy(),但当前代理对象不可用时。下面是一些解决此问题的建议:

1. 启用 exposeProxy 属性

确保你的 AOP 配置中设置了 exposeProxy 属性为 true。这可以在使用注解或 XML 配置中进行设置

使用注解

如果你使用的是基于注解的配置,可以通过 @EnableAspectJAutoProxy 注解来启用 AOP,并设置 exposeProxytrue

import org.springframework.context.annotation.EnableAspectJAutoProxy;

@EnableAspectJAutoProxy(exposeProxy = true)
public class AppConfig {
    // 其他配置
}

使用 XML 配置

如果你使用 XML 配置,可以像这样设置:

<aop:aspectj-autoproxy expose-proxy="true"/>

2. 确保在同一线程中调用

确保你在同一线程中调用 AopContext.currentProxy()。如果你在不同的线程中进行调用,Spring 将无法找到当前的代理。你可以通过在 AOP 方法内部调用 AopContext.currentProxy() 来确保这一点。

例如:

import org.springframework.aop.framework.AopContext;

public class MyService {

    public void myMethod() {
        MyService proxy = (MyService) AopContext.currentProxy();
        // 使用代理对象进行其他操作
    }
}

3. 确保 AOP 代理类型

确保你的 AOP 代理类型正确。如果你使用 JDK 动态代理,确保接口被实现;如果使用 CGLIB 代理,确保你的类是非 final 的。当你需要在同一类的方法中调用其他方法时,CGLIB 会更有效。

4. 检查 Spring 版本

确保你使用的 Spring 版本支持 AOP 上下文。如果使用的版本较旧,建议升级到最新版本,以获得更好的支持和修复。

5. 其他调试方法

  • 检查你的 Bean 的作用域:确保你的 Bean 不是使用 prototype 范围,因为 AopContext 不会对 prototype Bean 提供支持。
  • 日志输出:增加日志输出,确保在调用 AopContext.currentProxy() 时,AOP 代理确实存在。

示例代码  (采用这个办法,加一个@EnableAspectJAutoProxy(exposeProxy = true) 注解是可以解决的)

以下是一个完整的示例代码:

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.aop.framework.AopContext;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;

@EnableAspectJAutoProxy(exposeProxy = true)
@Component
public class MyService {

    public void myMethod() {
        MyService proxy = (MyService) AopContext.currentProxy();
        System.out.println("Using proxy: " + proxy);
        // 其他逻辑
    }
}

@Aspect
@Component
class MyAspect {

    @Before("execution(* MyService.myMethod(..))")
    public void beforeAdvice() {
        // 逻辑
    }
}

  确保你的 Spring 应用程序上下文配置正确后,再次运行应用程序,问题应该得到解决。

 

转自:chartGpt