Spring Boot+Axon CQRS应用:禁用Axon持久化改用Spring Data Repository
解决Axon命令执行后自动持久化的问题
针对你想用Spring Data Repository替代Axon仓库、禁用命令执行后Axon自动调用persist的需求,有个直接的解决方案:自定义一个不执行持久化逻辑的AggregateRepository,替换掉Axon默认的仓库实现。
步骤1:实现NoOp版本的AggregateRepository
创建一个自定义仓库类,重写persist方法让它空执行——这样Axon在命令处理完成后就不会触发默认的持久化操作了:
import org.axonframework.modelling.command.AggregateRepository; import org.axonframework.modelling.command.RepositoryProvider; import org.axonframework.modelling.command.inspection.AggregateModel; public class NoOpAggregateRepository<T> extends AggregateRepository<T> { public NoOpAggregateRepository(Class<T> aggregateType, AggregateModel<T> aggregateModel, RepositoryProvider repositoryProvider) { super(aggregateType, aggregateModel, repositoryProvider); } @Override protected void persist(T aggregate) { // 跳过Axon自带的持久化逻辑,什么都不做 } }
步骤2:在Spring配置中注册自定义仓库
在你的Spring Boot配置类里,把这个自定义仓库注册为Bean,指定对应的聚合类型,这样Axon会自动使用它代替默认仓库:
import org.axonframework.modelling.command.AggregateModel; import org.axonframework.modelling.command.RepositoryProvider; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AxonCustomConfig { @Bean public NoOpAggregateRepository<YourAggregate> yourAggregateRepository(AggregateModel<YourAggregate> aggregateModel, RepositoryProvider repositoryProvider) { return new NoOpAggregateRepository<>(YourAggregate.class, aggregateModel, repositoryProvider); } }
注意事项
- 因为你把
EventSourcingHandler移到了外部类,要确保这个类被Axon的事件处理器扫描到(比如加上@EventHandler注解),并且在里面正确通过Spring Data Repository完成实体的持久化。 - 这种方式确实属于Axon的非标准用法,可能会影响一些Axon原生特性(比如快照生成、事件溯源的完整性校验等),所以只适合你提到的临时方案场景。
内容的提问来源于stack exchange,提问作者Dorin
相关产品推荐
相关产品推荐

