Browse Source

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.
pull/664/head
Christoph Strobl 8 years ago committed by Mark Paluch
parent
commit
c079a8971e
  1. 2
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java
  2. 33
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java

2
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 @@ -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) {

33
spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java

@ -21,6 +21,8 @@ import static org.junit.Assert.*; @@ -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; @@ -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 { @@ -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> {
T content;
}
@ -2451,4 +2475,11 @@ public class MappingMongoConverterUnitTests { @@ -2451,4 +2475,11 @@ public class MappingMongoConverterUnitTests {
static class TypeWithPropertyInNestedField {
@Field("nested.sample") String sample;
}
@RequiredArgsConstructor
static class WithArrayInConstructor {
final String[] array;
}
}

Loading…
Cancel
Save