回滚Akka事件时的反序列化问题处理咨询
问题背景与疑问
初始代码结构:
Command1(name: String) State1 Event1(name: String) State2(data1: String, name: String)
为在State2中展示用户性别,对代码做了如下修改:
- 将
Command1调整为Command1(name: String, gender: String) - 在State1处理命令后,通过
Event.persist(Event1...)传递gender字段 - 为兼容旧事件重放,给Event1添加可选参数,修改后结构:
Command1(name: String, gender: String) State1 Event1(name: String, gender: Option[String] = None) State2(data1: String, name: String, gender: Option[String])
疑问:
- 若回滚应用到旧版本,已持久化的带gender字段的Event1会导致反序列化问题吗?
- 能否让应用忽略额外字段?
- 是否需要实现反序列化逻辑或数据迁移?
补充:当前使用jackson-json作为序列化绑定,希望实现“忽略未知属性”的效果。
解决方案说明
- 回滚后的反序列化问题:会触发默认的反序列化报错。旧版本的
Event1类没有gender字段,Jackson默认会将未知属性判定为错误,抛出UnrecognizedPropertyException。 - 实现忽略额外字段的方法:基于Jackson可以通过两种方式实现需求:
- 全局配置:在Jackson的
ObjectMapper实例中添加配置:configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false),该规则对所有序列化/反序列化的类生效 - 类级别注解:给旧版本的
Event1类添加@JsonIgnoreProperties(ignoreUnknown = true)注解,仅对该类的反序列化逻辑生效
- 全局配置:在Jackson的
- 是否需要自定义反序列化或数据迁移:
- 只要配置了上述忽略未知属性的规则,就不需要编写自定义反序列化逻辑
- 无需做数据迁移,旧版本应用读取带
gender的Event1时会自动忽略该字段,原有业务逻辑不受影响
内容的提问来源于stack exchange,提问作者RJB
相关产品推荐
相关产品推荐

