diff --git a/bson-kotlin/src/main/kotlin/org/bson/codecs/kotlin/DataClassCodec.kt b/bson-kotlin/src/main/kotlin/org/bson/codecs/kotlin/DataClassCodec.kt index 22d8aa0e22d..9027bec4574 100644 --- a/bson-kotlin/src/main/kotlin/org/bson/codecs/kotlin/DataClassCodec.kt +++ b/bson-kotlin/src/main/kotlin/org/bson/codecs/kotlin/DataClassCodec.kt @@ -85,6 +85,8 @@ internal data class DataClassCodec( if (logger.isTraceEnabled) { logger.trace("Found property not present in the DataClass: $fieldName") } + } else if (propertyModel.param.type.isMarkedNullable && reader.currentBsonType == BsonType.NULL) { + reader.readNull() } else { try { args[propertyModel.param] = decoderContext.decodeWithChildContext(propertyModel.codec, reader) diff --git a/bson-kotlin/src/test/kotlin/org/bson/codecs/kotlin/DataClassCodecTest.kt b/bson-kotlin/src/test/kotlin/org/bson/codecs/kotlin/DataClassCodecTest.kt index c99f9ad5f5f..c115b051529 100644 --- a/bson-kotlin/src/test/kotlin/org/bson/codecs/kotlin/DataClassCodecTest.kt +++ b/bson-kotlin/src/test/kotlin/org/bson/codecs/kotlin/DataClassCodecTest.kt @@ -126,6 +126,9 @@ class DataClassCodecTest { fun testDataClassWithNulls() { val dataClass = DataClassWithNulls(null, null, null) assertRoundTrips(emptyDocument, dataClass) + + val withStoredNulls = BsonDocument.parse("""{"boolean": null, "string": null, "listSimple": null}""") + assertDecodesTo(withStoredNulls, dataClass) } @Test