尽管至少存在一个创建者,但无法构造类的实例

时间:2019-09-16 20:02:17

标签: kotlin jackson deserialization

在与杰克逊反序列化LocationGeneric时,我在Kotlin中遇到以下问题。当我没有在用于构造具体类的抽象类中添加任何额外信息时,就是这种情况。当我反序列化LocationOneLocationTwo时,效果很好。

这是我编写的代码:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, 
        property = "type", visible = true)
@JsonSubTypes(
        JsonSubTypes.Type(value = LocationOne::class, name = "ONE"),
        JsonSubTypes.Type(value = LocationTwo::class, name = "TWO"),
        JsonSubTypes.Type(value = LocationGeneric::class, name = "GENERIC_1"),
        JsonSubTypes.Type(value = LocationGeneric::class, name = "GENERIC_2")
)
abstract class Location(
        val type: String
)

class LocationGeneric(
        type: String
): Location(type)

class LocationOne(
        type: String,
        val somethingSpecific: String
): Location(type)

class LocationAirport(
        type: String,
        val somethingElse: String
): Location(type)

这是我得到的错误:

  

无法构造Location的实例(尽管至少有一个创建者   存在):无法从对象值反序列化(无委托或   基于资源的创作者)

我尝试将抽象类更改为开放类,但到目前为止还没有运气。我为其他情况工作。为什么在LocationGeneric情况下找不到默认的Kotlin构造函数?有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我遇到的问题是,杰克逊以某种方式失去了构造函数的可见性,因此我为泛型实例提供了默认实现,并注释了泛型实现的构造函数和属性。

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY,
        property = "type", visible = true, defaultImpl = LocationGeneric::class)
@JsonSubTypes(
        JsonSubTypes.Type(value = LocationOne::class, name = "ONE"),
        JsonSubTypes.Type(value = LocationTwo::class, name = "TWO")
)
abstract class Location(
        val type: String
)

class LocationGeneric @JsonCreator constructor(
        @JsonProperty("type") type: String
): Location(type)

这也使我可以添加init来处理奇怪的映射情况。