Skip to content

Deserialization of generic class with nullable values failes #917

Description

@Janik7777

Search before asking

  • I searched in the issues and found nothing similar.
  • I have confirmed that the same problem is not reproduced if I exclude the KotlinModule.
  • I searched in the issues of databind and other modules used and found nothing similar.
  • I have confirmed that the problem does not reproduce in Java and only occurs when using Kotlin and KotlinModule.

Describe the bug

Error occurs during deserialization of my generic class:

com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException: Instantiation of [simple type, class SerializationTest$test_deserialization$Example<java.lang.String>] value failed for JSON property data due to missing (therefore NULL) value for creator parameter data which is a non-nullable type
 at [Source: (StringReader); line: 3, column: 1] (through reference chain: SerializationTest$test_deserialization$Example["data"])
	at com.fasterxml.jackson.module.kotlin.KotlinValueInstantiator.createFromObjectWith(KotlinValueInstantiator.kt:97)
	at com.fasterxml.jackson.databind.deser.impl.PropertyBasedCreator.build(PropertyBasedCreator.java:214)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:541)
	at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1497)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:348)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:185)
	at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:342)
	at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4917)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3860)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3843)
	at SerializationTest.test_deserialization(SerializationTest.kt:36)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)

This is my data class

@JsonIgnoreProperties(ignoreUnknown = true)
data class Example<T> @JsonCreator constructor(
    @JsonProperty("data") var data: T,
    @JsonProperty("number") var number : Int,
)

I want use it for non null and nullable data types for T. One example usage would be:

val value = Example<String?>(null, 10)

We want our YAML file only to include non-null fields, so we use the option setSerializationInclusion(JsonInclude.Include.NON_NULL) for the mapper.

But now the deserialization fails.

To Reproduce

import com.fasterxml.jackson.annotation.JsonCreator
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
import com.fasterxml.jackson.annotation.JsonInclude
import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
import com.fasterxml.jackson.module.kotlin.readValue
import com.fasterxml.jackson.module.kotlin.registerKotlinModule
import org.junit.jupiter.api.Test

class SerializationTest {
    @Test
    fun test_deserialization () {
        @JsonIgnoreProperties(ignoreUnknown = true)
        data class Example<T> @JsonCreator constructor(
            @JsonProperty("data") var data: T,
            @JsonProperty("number") var number : Int,
        )
        val yamlMapper = ObjectMapper(
            YAMLFactory()
        )
            .registerKotlinModule()
            .setSerializationInclusion(JsonInclude.Include.NON_NULL)

        val value = Example<String?>(null, 10)
        val yamlString = yamlMapper.writeValueAsString(value)
        val deserializedValue = yamlMapper.readValue<Example<String?>>(yamlString)
    }
}

Expected behavior

deserializedValue == Example<String?>(null, 10)

Versions

Kotlin:
Jackson-module-kotlin: 2.18.2
Jackson-databind: 2.18.2

Additional context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions