Spring Boot整合JPA与Axon Server报错找不到TokenEntry实体如何解决
你自定义@EntityScan注解后,Spring Boot默认的实体类扫描规则会被覆盖,只会扫描你指定的包路径。虽然你配置了用Axon Server作为事件存储,但Axon Framework的事件处理器默认会使用JPA实现的令牌存储(TokenStore)来记录事件消费进度,对应的org.axonframework.eventhandling.tokenstore.jpa.TokenEntry实体类不在你指定的扫描路径下,所以Hibernate无法识别这个实体,抛出找不到持久化器的异常。
你可以根据自己的使用场景选择以下任意一种方案:
方案1:扩展
@EntityScan的扫描路径,把Axon的令牌实体所在包也加入扫描范围
启动类注解示例:@EntityScan(basePackages = {"你的自定义JPA实体所在包路径", "org.axonframework.eventhandling.tokenstore.jpa"})若后续需要使用Axon的JPA Saga存储,还需要额外添加
org.axonframework.modelling.saga.repository.jpa包到扫描路径中。方案2:显式配置令牌存储使用内存实现(仅适合开发测试环境)
在application.yml/application.properties中添加如下配置:axon: eventhandling: processor: default: token-store: in-memory注意:内存令牌存储在应用重启后会丢失所有事件消费进度,生产环境禁止使用。
方案3:完全禁用Axon的JPA自动配置
如果你完全不想用JPA实现Axon的任何存储能力,可以在启动类的@SpringBootApplication注解中排除Axon JPA自动配置类:@SpringBootApplication(exclude = {org.axonframework.springboot.autoconfig.AxonJpaAutoConfiguration.class})配置后Axon不会自动加载JPA相关的存储实现,会默认使用内存实现,你也可以自行配置其他类型的令牌存储。
建议在配置文件中添加以下配置,明确关闭Axon的JPA事件存储,避免冗余操作:
axon: axonserver: enabled: true event: storage: jpa: enabled: false
内容的提问来源于stack exchange,提问作者user1409534

