kotlin не может сериализовать объект с наследованием, используя Джексона ObjectMapper в CentOS, но нормально в MacOS (MissingKotlinParameterException) - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть абстрактный класс, который является родителем двух конкретных классов. Я аннотировал поле 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...