基于Axon的Spring Boot微服务@EventHandler不触发事件无法落库问题
问题根因与解决方案
根因
你遇到的问题直接由日志中抛出的com.thoughtworks.xstream.security.ForbiddenClassException导致:
Axon框架默认使用XStream作为事件序列化/反序列化工具,1.4.18及以上版本的XStream新增了严格的安全校验规则,默认禁止反序列化未加入白名单的自定义业务类。事件从事件存储取出后反序列化失败,跟踪事件处理器直接进入重试模式,根本不会触发你编写的@EventHandler方法,因此无法将数据持久化到实体表。
解决方案
方案1:配置XStream类白名单
你可以通过配置将你的事件所在包加入XStream的允许反序列化列表,两种配置方式二选一即可:
配置文件方式
在application.properties或application.yml中添加如下配置:
axon.serializer.xstream.allow-types=com.solinvictus.Products.CQRS.events.**
代码配置方式
新增Axon配置类自定义XStream实例:
@Configuration public class AxonXstreamConfig { @Bean public XStream xStream() { XStream xStream = new XStream(); // 按包路径配置白名单,支持通配符 xStream.allowTypesByWildcard(new String[] { "com.solinvictus.Products.CQRS.events.**", // 后续新增的事件、命令类所在包也可以加在这里 }); return xStream; } }
方案2:更换为Jackson序列化器
也可以直接将Axon的默认序列化器更换为Jackson,从根源上避免XStream的安全限制问题,在配置文件中添加如下配置即可:
axon: serializer: general: jackson events: jackson messages: jackson
注意更换序列化器后,你的事件类需要添加无参构造方法,保证Jackson可以正常反序列化。
额外排查点
如果配置完成后还存在问题,可以检查以下两点:
- 确认
ProductEventsHandler类所在的包在Spring Boot的扫描路径下,@Service注解正常生效,该类被正确实例化到Spring容器中 - 确认
@EventHandler注解导入的是org.axonframework.eventhandling.EventHandler包,没有误导入其他框架的同名注解
内容的提问来源于stack exchange,提问作者Aayush Sahu
相关产品推荐
相关产品推荐

