事件类随Axon CQRS改变

问题描述 投票:0回答:1

虽然在轴突中测试事件迁移,但我发现实际上具有默认值的新字段设置为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模块。

java spring-boot kotlin cqrs axon
1个回答
0
投票

这听起来像是杰克逊ObjectMapper用于反序列化事件的配置不正确。为了使其能够使用Kotlin特有的功能(例如默认值),您需要注册Kotlin模块:https://github.com/FasterXML/jackson-module-kotlin

val mapper = ObjectMapper().registerModule(KotlinModule())
© www.soinside.com 2019 - 2024. All rights reserved.