Java Spring Bean代理创建失败报Cannot find current proxy该如何解决?
Spring Bean代理获取失败问题解决方案
根本原因
- 报错栈明确指向
ApiApplication类main方法第26行的AopContext.currentProxy()调用,此时Spring上下文尚未完成初始化,所有Bean的代理对象还未构建完成,调用必然抛出异常。 - 业务代码中
@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
相关产品推荐
相关产品推荐

