diff --git a/pom.xml b/pom.xml
index a6d5da9170..d413b40ae2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-mongodb-parent
- 3.3.0-SNAPSHOT
+ 3.3.0-GH-3686-SNAPSHOT
pom
Spring Data MongoDB
diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml
index 0033bd11d5..47df593531 100644
--- a/spring-data-mongodb-benchmarks/pom.xml
+++ b/spring-data-mongodb-benchmarks/pom.xml
@@ -7,7 +7,7 @@
org.springframework.data
spring-data-mongodb-parent
- 3.3.0-SNAPSHOT
+ 3.3.0-GH-3686-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml
index f62c8dc7f4..a4706d3f8a 100644
--- a/spring-data-mongodb-distribution/pom.xml
+++ b/spring-data-mongodb-distribution/pom.xml
@@ -14,7 +14,7 @@
org.springframework.data
spring-data-mongodb-parent
- 3.3.0-SNAPSHOT
+ 3.3.0-GH-3686-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml
index 1f157e75bc..4df87665d8 100644
--- a/spring-data-mongodb/pom.xml
+++ b/spring-data-mongodb/pom.xml
@@ -11,7 +11,7 @@
org.springframework.data
spring-data-mongodb-parent
- 3.3.0-SNAPSHOT
+ 3.3.0-GH-3686-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java
index 732e8c9a51..14d6ddda08 100644
--- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java
@@ -2006,12 +2006,16 @@ protected static class ConversionContext {
/**
* Converts a source object into {@link TypeInformation target}.
*
- * @param source must not be {@literal null}.
+ * @param source can be {@literal null}.
* @param typeHint must not be {@literal null}.
* @return the converted object.
*/
@SuppressWarnings("unchecked")
- public S convert(Object source, TypeInformation extends S> typeHint) {
+ public S convert(@Nullable Object source, TypeInformation extends S> typeHint) {
+
+ if(source == null) {
+ return null;
+ }
Assert.notNull(typeHint, "TypeInformation must not be null");
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java
index 0361571414..c8e2fec155 100644
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java
@@ -2532,6 +2532,41 @@ void shouldWriteNullPropertyCorrectly() {
assertThat(document).containsEntry("writeAlwaysPerson", null).doesNotContainKey("writeNonNullPerson");
}
+ @Test // GH-3686
+ void readsCollectionContainingNullValue() {
+
+ org.bson.Document source = new org.bson.Document("items", Arrays.asList(new org.bson.Document("itemKey", "i1"), null, new org.bson.Document("itemKey", "i3")));
+
+ Order target = converter.read(Order.class, source);
+
+ assertThat(target.items)
+ .map(it -> it != null ? it.itemKey : null)
+ .containsExactly("i1", null, "i3");
+ }
+
+ @Test // GH-3686
+ void readsArrayContainingNullValue() {
+
+ org.bson.Document source = new org.bson.Document("arrayOfStrings", Arrays.asList("i1", null, "i3"));
+
+ WithArrays target = converter.read(WithArrays.class, source);
+
+ assertThat(target.arrayOfStrings).containsExactly("i1", null, "i3");
+ }
+
+ @Test // GH-3686
+ void readsMapContainingNullValue() {
+
+ org.bson.Document source = new org.bson.Document("mapOfObjects", new org.bson.Document("item1", "i1").append("item2", null).append("item3", "i3"));
+
+ ClassWithMapProperty target = converter.read(ClassWithMapProperty.class, source);
+
+ assertThat(target.mapOfObjects)
+ .containsEntry("item1", "i1")
+ .containsEntry("item2", null)
+ .containsEntry("item3", "i3");
+ }
+
static class GenericType {
T content;
}
@@ -2893,6 +2928,10 @@ static class WithArrayInConstructor {
}
+ static class WithArrays {
+ String[] arrayOfStrings;
+ }
+
// DATAMONGO-1898
// DATACMNS-1278