在与杰克逊反序列化LocationGeneric
时,我在Kotlin中遇到以下问题。当我没有在用于构造具体类的抽象类中添加任何额外信息时,就是这种情况。当我反序列化LocationOne
或LocationTwo
时,效果很好。
这是我编写的代码:
@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构造函数?有什么想法吗?
答案 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
来处理奇怪的映射情况。