У меня есть абстрактный класс, который является родителем двух конкретных классов. Я аннотировал поле role
типа enum class Role
, чтобы ObjectMapper мог определить фактический класс.
Он прекрасно работает, когда я выполняю его в macOS, но он генерирует исключение при выполнении в CentOS.
Оба построены с использованием maven и выполнены с использованием .jar
Основная программа
val str = "{\"role\":\"SERVER\" /*...*/}"
println(str)
val res = Mongo.mapper.readValue(str, Connection::class.java);
println(res);
Классы
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "role",
visible = true
)
@JsonSubTypes(
JsonSubTypes.Type(value = ClientConnection::class, name="CLIENT"),
JsonSubTypes.Type(value = ServerConnection::class, name="SERVER")
abstract class Connection{
val role: Role
//...
}
enum class Role{
CLIENT, SERVER
}
class ServerConnection(
role : Role = Role.SERVER,
//...
): Connection(
role
//...
) {}
Исключение:
Exception in thread "main" com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException: Instantiation of [simple type, class com.x.mongo.ServerConnection] value failed for JSON property role due to missing (therefore NULL) value for creator parameter role which is a non-nullable type
at [Source: (String)"{"role":"SERVER" /* ... */}"; line: 1, column: 192] (through reference chain: com.x.mongo.ServerConnection["role"])
at com.fasterxml.jackson.module.kotlin.KotlinValueInstantiator.createFromObjectWith(KotlinValueInstantiator.kt:107)
at com.fasterxml.jackson.databind.deser.impl.PropertyBasedCreator.build(PropertyBasedCreator.java:198)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:488)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1287)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:194)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:161)
at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:130)
at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:97)
at com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserializeWithType(AbstractDeserializer.java:254)
at com.fasterxml.jackson.databind.deser.impl.TypeWrappedDeserializer.deserialize(TypeWrappedDeserializer.java:68)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4202)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3205)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3173)
at com.X.AppKt.main(App.kt:40)
at com.x.AppKt.main(App.kt)