From c079a8971edf276201857b3b2d40830bc538effd 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 | 33 ++++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) 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 859b42236..e78cff8b4 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 @@ -894,7 +894,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()); } for (Object dbObjItem : 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 901f6d8e2..f5327bac5 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.DBObjectTestUtils.*; +import lombok.RequiredArgsConstructor; + import java.math.BigDecimal; import java.math.BigInteger; import java.net.URL; @@ -97,7 +99,7 @@ import com.mongodb.util.JSON; /** * Unit tests for {@link MappingMongoConverter}. - * + * * @author Oliver Gierke * @author Patrik Wasik * @author Christoph Strobl @@ -2101,6 +2103,28 @@ public class MappingMongoConverterUnitTests { assertThat(converter.read(ClassWithEnumProperty.class, source).enumSet, is(EnumSet.noneOf(SampleEnum.class))); } + /** + * @see DATAMONGO-1831 + */ + @Test + public void shouldConvertArrayInConstructorCorrectly() { + + DBObject source = new BasicDBObject("array", Collections.emptyList()); + + assertThat(converter.read(WithArrayInConstructor.class, source).array, is(emptyArray())); + } + + /** + * @see DATAMONGO-1831 + */ + @Test + public void shouldConvertNullForArrayInConstructorCorrectly() { + + DBObject source = new BasicDBObject(); + + assertThat(converter.read(WithArrayInConstructor.class, source).array, is(nullValue())); + } + static class GenericType { T content; } @@ -2451,4 +2475,11 @@ public class MappingMongoConverterUnitTests { static class TypeWithPropertyInNestedField { @Field("nested.sample") String sample; } + + @RequiredArgsConstructor + static class WithArrayInConstructor { + + final String[] array; + + } }