From 7401e5e01badcef2ab79c765e0d86f1aaa7898cf Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Fri, 1 Dec 2017 10:40:15 +0100 Subject: [PATCH] DATAMONGO-1831 - Fix array type conversion for empty source. We now make sure that we convert empty sources to the corresponding target type. This prevents entity instantiation from failing due to incorrect argument types when invoking the constructor. Original pull request: #520. --- .../core/convert/MappingMongoConverter.java | 2 +- .../MappingMongoConverterUnitTests.java | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) 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 85b554ca3..d03349522 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 @@ -954,7 +954,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App : CollectionFactory.createCollection(collectionType, rawComponentType, sourceValue.size()); if (sourceValue.isEmpty()) { - return getPotentiallyConvertedSimpleRead(items, collectionType); + return getPotentiallyConvertedSimpleRead(items, targetType.getType()); } if (!DBRef.class.equals(rawComponentType) && isCollectionOfDbRefWhereBulkFetchIsPossible(sourceValue)) { 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 81cc77a7f..90ab333d2 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 @@ -21,6 +21,8 @@ import static org.junit.Assert.*; import static org.mockito.Mockito.*; import static org.springframework.data.mongodb.core.DocumentTestUtils.*; +import lombok.RequiredArgsConstructor; + import java.math.BigDecimal; import java.math.BigInteger; import java.net.URL; @@ -1803,6 +1805,22 @@ public class MappingMongoConverterUnitTests { converter.read(TypeWithMapOfLongValues.class, source); } + @Test // DATAMONGO-1831 + public void shouldConvertArrayInConstructorCorrectly() { + + org.bson.Document source = new org.bson.Document("array", Collections.emptyList()); + + assertThat(converter.read(WithArrayInConstructor.class, source).array, is(emptyArray())); + } + + @Test // DATAMONGO-1831 + public void shouldConvertNullForArrayInConstructorCorrectly() { + + org.bson.Document source = new org.bson.Document(); + + assertThat(converter.read(WithArrayInConstructor.class, source).array, is(nullValue())); + } + static class GenericType { T content; } @@ -2157,4 +2175,11 @@ public class MappingMongoConverterUnitTests { static class TypeWithMapOfLongValues { Map map; } + + @RequiredArgsConstructor + static class WithArrayInConstructor { + + final String[] array; + + } }