FasterXML / FasterXML/jackson-module-kotlin
Deserialization of generic class with nullable values failes
- Dominant language
- Kotlin
- Stars
- 1.2k
- Forks
- 187
- Avg merge
- 9h 48m
- Merged PRs (30d)
- 16
Description
### Search before asking
- [x] I searched in the [issues](https://github.com/FasterXML/jackson-module-kotlin/issues) and found nothing similar.
- [x] I have confirmed that the same problem is not reproduced if I exclude the KotlinModule.
- [x] I searched in the [issues of databind](https://github.com/FasterXML/jackson-databind/issues) 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] 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
```kt
@JsonIgnoreProperties(ignoreUnknown = true)
data class Example @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:
```kt
val value = Example(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
```kotlin
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 @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(null, 10)
val yamlString = yamlMapper.writeValueAsString(value)
val deserializedValue = yamlMapper.readValue>(yamlString)
}
}
```
### Expected behavior
deserializedValue == Example(null, 10)
### Versions
Kotlin:
Jackson-module-kotlin: 2.18.2
Jackson-databind: 2.18.2
### Additional context
_No response_
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.