虽然在轴突中测试事件迁移,但我发现实际上具有默认值的新字段设置为null。将字段(具有默认值)实际添加到先前事件的好方法是什么?我不想拥有一个MyEventV2,其中的值是强制性的(没有默认值),也不想指定一个上播者。
首先,我们有此事件,它已发布并存储在轴突服务器中:
data class MyEvent(
val someId: String,
val name: String
)
稍后我们更改MyEvent,我们提供一个默认值以保持与先前事件的兼容性,我们希望旧事件具有该默认值。实际结果:接收到旧事件时,“ newField”为null。
data class MyEvent(
val someId: String,
val name: String,
val newField: String = "defaultValueButWillBeNullInPreviousEvents... -> would need it to have the actual default value"
)
[我使用轴突服务器,轴突4.2,春季启动2.2.0,所有默认值来自轴突启动启动器,杰克逊2.10.0进行了测试
我们应该使用类似(但一点也不好...):
data class MyEvent(
val someId: String,
val name: String,
private val newFieldV2: String? = null
) {
val newField: String
get() = newFieldV2 ?: "my default value"
}
我还没有检查轴突如何从事件存储中重建事件,但我想它是通过字段访问(反射)而不是构造函数来完成的。但是很奇怪,因为数据类没有提供默认的空构造函数...
编辑:默认情况下,Axon使用XStreamSerializer,我已将配置切换为使用jackson,但仍然存在问题,并且已注册jackson kotlin模块。
这听起来像是杰克逊ObjectMapper用于反序列化事件的配置不正确。为了使其能够使用Kotlin特有的功能(例如默认值),您需要注册Kotlin模块:https://github.com/FasterXML/jackson-module-kotlin
val mapper = ObjectMapper().registerModule(KotlinModule())