-
-
Notifications
You must be signed in to change notification settings - Fork 181
Open
Labels
Description
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