我想使用Jackson mixin为抽象类型提供默认实现:

@JsonTypeInfo(
    use = Id.NAME,
    include = As.PROPERTY,
    property = "type",
    visible = true,
    defaultImpl = GenericRequest::class
)
@JsonMixin(Request::class)
class AlexaRequestMixin {
}

data class GenericRequest(
    val type: String, val requestId: String, val timestamp: OffsetDateTime
)

要使用mixin更改的基类:

@JsonTypeInfo(
    use = Id.NAME,
    include = As.PROPERTY,
    property = "type",
    visible = true
)
@JsonSubTypes({@Type(
    value = InstallationError.class,
    name = "Alexa.DataStore.PackageManager.InstallationError"
), 
// ...
)})
public abstract class Request {

objectMapper年款:

object mapper

但是,当我try 反序列化不作为子类型存在的类时,我得到:

com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve type id 'Foo' as a subtype of 'com.amazon.ask.model.Request': known type ids = [...]

推荐答案

为了让它发挥作用,我必须:

使GenericRequest从抽象Request类扩展.

当抽象类来自Java而继承数据类来自Kotlin时,会导致很多问题.

a) 数据类不能重写抽象类https://youtrack.jetbrains.com/issue/KT-6653/Kotlin-properties-do-not-override-Java-style-getters-and-setters中的相同属性

b) 我不得不把include = As.PROPERTY改成include = JsonTypeInfo.As.WRAPPER_ARRAY

所以我最终在Java中实现了GenericRequest扩展Request...

Kotlin相关问答推荐

Kotlin-stdlib中的模拟扩展函数

如何将消费者放入 Kotlin 的 map 中?

找不到有效的 Docker 环境

Kotlin:调用 CoroutineScope.launch 与在协程内启动之间的区别

使用 LazyListScope 嵌套可组合项

是否可以通过超时暂停协程?

Kotlin 方法重载

Kotlin 中的部分类委托

如何将 kotlin 集合作为 varagrs 传递?

DatabaseManager_Impl 不是抽象的,不会覆盖 RoomDatabase 中的抽象方法 clearAllTables()

带有迭代器函数的 Kotlin 无限序列

Kotlin惰性默认属性

Jetpack Compose State:修改类属性

Kotlin 中的内联构造函数是什么?

如何在Kotlin中创建填充空值的通用数组?

参数不匹配;SimpleXML

TornadoFX 中设置 PrimaryStage 或 Scene 属性的方法

修改扩展函数中的this

这是 Kotlin 中的错误还是我遗漏了什么?

我应该在哪里调用 MobileAds.initialize()?