添加spring-data-jpa、h2依赖后Axon出现Bean循环引用报错如何解决
Axon 循环引用报错排查解决步骤
1 初始无JPA、h2依赖时报错的根因
Axon 自动配置默认使用JPA作为事件存储、令牌存储、Saga存储的默认实现,未指定其他存储方案时,会自动扫描JPA和嵌入式数据库依赖,缺失依赖时会触发核心Bean初始化失败,进而导致commandGateway创建时的循环引用报错。
2 引入JPA+h2后新增entityManagerFactory循环引用的排查方向
- 检查是否自定义了
CommandGateway、EventStore等Axon核心Bean,且Bean的初始化逻辑中注入了JPA持久层组件(如自定义Repository、EntityManager),Axon存储实现本身依赖entityManagerFactory,就会形成依赖循环。 - 检查
application.properties中的JPA配置:若配置了spring.jpa.entity-packages指定实体扫描路径,未包含Axon内置的存储实体所在包,会导致entityManagerFactory初始化时无法加载Axon所需的表结构,反过来等待Axon Bean初始化完成,形成循环。 - 检查自定义Controller代码:若Controller同时注入了
CommandGateway和JPA持久层组件,且Controller被事务、审计等依赖JPA的切面增强,也会触发循环依赖。
3 快速验证方案
在application.properties中添加如下配置,禁用Axon默认JPA存储,切换为内存实现,验证循环依赖是否和存储配置相关:
# 禁用Axon JPA自动配置 axon.jpa.enabled=false # 事件存储切换为内存实现 axon.event.storage=inmemory # 令牌存储切换为内存实现 axon.eventhandling.tokenstore.type=inmemory # Saga存储切换为内存实现 axon.saga.store=inmemory
启动项目后如果不再报错,说明根因为JPA存储相关的依赖循环,可根据业务需求选择对应解决方案:
- 不需要持久化事件、令牌数据:直接保留上述内存配置,删除spring-data-jpa、h2依赖即可。
- 需要使用JPA做持久化:给注入Axon核心Bean的组件添加
@Lazy注解,延迟加载Axon Bean打破循环,同时在spring.jpa.entity-packages中添加Axon实体包org.axonframework.eventhandling.tokenstore.jpa、org.axonframework.eventsourcing.eventstore.jpa。
4 兜底解决方法
如果无法定位具体循环依赖点,Spring Boot 2.6及以上版本可添加如下配置允许循环引用:
spring.main.allow-circular-references=true
内容的提问来源于stack exchange,提问作者Elegbede Yusuf Oladipupo
相关产品推荐
相关产品推荐

