FasterXML / FasterXML/jackson-module-kotlin

Deserialization of generic class with nullable values failes

Open
#917 7 comments 0 reactions 0 assignees View on GitHub
bug
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.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.