DATADOC-192 - MappingMongoConverter handles collections correctly now.
Replaced hard coded List creation with delegate to Spring's CollectionFactory. Although the List should get converted before setting the value we can prevent that additional step by looking up the correct collection type upfront.
This commit is contained in:
@@ -644,6 +644,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
|
||||
}
|
||||
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected Object getValueInternal(MongoPersistentProperty prop, DBObject dbo, StandardEvaluationContext ctx, String spelExpr) {
|
||||
|
||||
Object o;
|
||||
@@ -674,8 +675,10 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
|
||||
// It's empty
|
||||
return Array.newInstance(prop.getComponentType(), 0);
|
||||
} else if (prop.isCollection() && sourceValue instanceof BasicDBList) {
|
||||
|
||||
BasicDBList dbObjList = (BasicDBList) sourceValue;
|
||||
List<Object> items = new ArrayList<Object>();
|
||||
Collection<Object> items = CollectionFactory.createCollection(propertyType, dbObjList.size());
|
||||
|
||||
for (int i = 0; i < dbObjList.size(); i++) {
|
||||
Object dbObjItem = dbObjList.get(i);
|
||||
if (dbObjItem instanceof DBRef) {
|
||||
@@ -686,11 +689,8 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
|
||||
items.add(dbObjItem);
|
||||
}
|
||||
}
|
||||
List<Object> itemsToReturn = new ArrayList<Object>();
|
||||
for (Object obj : items) {
|
||||
itemsToReturn.add(obj);
|
||||
}
|
||||
return itemsToReturn;
|
||||
|
||||
return items;
|
||||
}
|
||||
|
||||
Class<?> toType = findTypeToBeUsed((DBObject) sourceValue);
|
||||
|
||||
@@ -29,6 +29,8 @@ import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.joda.time.LocalDate;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -363,6 +365,20 @@ public class MappingMongoConverterUnitTests {
|
||||
assertThat(typedOuterString.size(), is(1));
|
||||
}
|
||||
|
||||
/**
|
||||
* @see DATADOC-192
|
||||
*/
|
||||
@Test
|
||||
public void readsEmptySetsCorrectly() {
|
||||
|
||||
Person person = new Person();
|
||||
person.addresses = Collections.emptySet();
|
||||
|
||||
DBObject dbObject = new BasicDBObject();
|
||||
converter.write(person, dbObject);
|
||||
converter.read(Person.class, dbObject);
|
||||
}
|
||||
|
||||
class ClassWithEnumProperty {
|
||||
|
||||
SampleEnum sampleEnum;
|
||||
@@ -386,6 +402,8 @@ public class MappingMongoConverterUnitTests {
|
||||
|
||||
@Field("foo")
|
||||
String firstname;
|
||||
|
||||
Set<Address> addresses;
|
||||
}
|
||||
|
||||
class ClassWithMapProperty {
|
||||
|
||||
Reference in New Issue
Block a user