Skip to content

EXTERNAL_PROPERTY doesn't work with @JsonIgnoreProperties #2610

@ashlanderr

Description

@ashlanderr

I am using polymorphic deserialization with Kotlin data classes like this:

@JsonIgnoreProperties(ignoreUnknown = true)
data class Value(
    val type: String,

    @JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
        property = "type",
        defaultImpl = Default::class
    )
    val data: Default
)

object Default

trying to deserialize:

val data = """[{"type": "test","data": {},"additional": {}}]"""

val mapper = ObjectMapper()
    .registerModule(KotlinModule())

val result = mapper.readValue<List<Value>>(data)

and I get this error:

Exception in thread "main" com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException: Instantiation of [simple type, class app.Value] value failed for JSON property type due to missing (therefore NULL) value for creator parameter type which is a non-nullable type
 at [Source: (String)"[{"type": "test","data": {},"additional": {}}]"; line: 1, column: 45] (through reference chain: java.util.ArrayList[1]->app.Value["type"])
	at com.fasterxml.jackson.module.kotlin.KotlinValueInstantiator.createFromObjectWith(KotlinValueInstantiator.kt:112)
	at com.fasterxml.jackson.databind.deser.impl.PropertyBasedCreator.build(PropertyBasedCreator.java:198)
	at com.fasterxml.jackson.databind.deser.impl.ExternalTypeHandler.complete(ExternalTypeHandler.java:316)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeUsingPropertyBasedWithExternalTypeId(BeanDeserializer.java:1001)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeWithExternalTypeId(BeanDeserializer.java:853)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:324)
	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.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:286)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:27)
	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:3188)
	at app.ApplicationKt.main(Application.kt:52)

If I will remove "additional" property from serialized JSON, add "additional" property to the Value class, or remove polymorphic deserialization, then the error will go away. I am using @JsonIgnoreProperties(ignoreUnknown = true) annotation, so I expected that the original case would work.

Jackson Version: 2.10.2

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions