You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Spring Bean代理创建失败报Cannot find current proxy该如何解决?

Spring Bean代理获取失败问题解决方案

根本原因

  1. 报错栈明确指向ApiApplication类main方法第26行的AopContext.currentProxy()调用,此时Spring上下文尚未完成初始化,所有Bean的代理对象还未构建完成,调用必然抛出异常。
  2. 业务代码中@Async注解修饰的方法会在Spring异步线程池的独立线程中执行,AopContext的代理上下文是和发起AOP调用的线程绑定的,异步新线程未绑定原代理上下文,即使修复main方法的问题,后续执行到异步调用逻辑时仍会触发相同报错。

解决方案

第一步:修复启动类错误

直接删除ApiApplication的main方法中所有对AopContext.currentProxy()的调用,该调用在Spring初始化完成前执行没有任何业务意义。

第二步:解决异步场景下代理获取问题

推荐使用自身代理注入方案,避免依赖线程绑定的AopContext,Spring天然支持这种循环依赖场景,代码修改如下:

@Service
public class ResourceService {
    // 直接注入自身的代理实例
    @Autowired
    private ResourceService selfProxy;

    @Transactional
    public void updateState(List<Long> ids, ResourceState state) {
        // 替换原AopContext获取代理的逻辑
        selfProxy.updateStateBySystem(Lists.newArrayList(repository.findAllById(ids)), state);
    }

    @Async
    @Transactional
    public void purchaseForOrder(Order order) {
        List<Resource> list = getResourcesForItem(order.getId(), null);
        // 同样用注入的代理调用,保证@Transactional注解生效
        selfProxy.updateState(list.stream().map(ApplicationModel::getId).collect(Collectors.toList()), ResourceState.PURCHASING);
    }
}

注意事项

同时标注@Async和@Transactional的方法,事务仅在当前异步线程内生效,不会和主线程共享事务上下文,需确认该逻辑符合你的业务预期。

内容的提问来源于stack exchange,提问作者SimonNechypurenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 09:09:08