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 c1fcccc66..ecae9d227 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 @@ -75,6 +75,8 @@ import org.springframework.util.StringUtils; public class MappingMongoConverter extends AbstractMongoConverter implements ApplicationContextAware, TypeMapperProvider { + @SuppressWarnings("rawtypes") + private static final TypeInformation MAP_TYPE_INFORMATION = ClassTypeInformation.from(Map.class); private static final List> VALID_ID_TYPES = Arrays.asList(new Class[] { ObjectId.class, String.class, BigInteger.class, byte[].class }); @@ -325,7 +327,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App } if (Map.class.isAssignableFrom(obj.getClass())) { - writeMapInternal((Map) obj, dbo, null); + writeMapInternal((Map) obj, dbo, MAP_TYPE_INFORMATION); return; } @@ -552,6 +554,13 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App return dbList; } + /** + * Writes the given {@link Map} to the given {@link DBObject} considering the given {@link TypeInformation}. + * + * @param obj must not be {@literal null}. + * @param dbo must not be {@literal null}. + * @param propertyType must not be {@literal null}. + */ protected void writeMapInternal(Map obj, DBObject dbo, TypeInformation propertyType) { for (Map.Entry entry : obj.entrySet()) { Object key = entry.getKey(); @@ -586,7 +595,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App */ protected void addCustomTypeKeyIfNecessary(TypeInformation type, Object value, DBObject dbObject) { - if (type == null) { + if (type == null || type.getActualType() == null) { return; } 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 32a19fc5c..b3e40bc45 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 @@ -712,6 +712,26 @@ public class MappingMongoConverterUnitTests { assertThat(wrapper.listOfMaps.get(0).get("Foo"), is(Locale.ENGLISH)); } + /** + * @see DATADOC-259 + */ + @Test + public void writesPlainMapOfCollectionsCorrectly() { + + Map> map = Collections.singletonMap("Foo", Arrays.asList(Locale.US)); + DBObject result = new BasicDBObject(); + converter.write(map, result); + + assertThat(result.containsField("Foo"), is(true)); + assertThat(result.get("Foo"), is(notNullValue())); + assertThat(result.get("Foo"), is(BasicDBList.class)); + + BasicDBList list = (BasicDBList) result.get("Foo"); + + assertThat(list.size(), is(1)); + assertThat(list.get(0), is((Object) Locale.US.toString())); + } + class GenericType { T content; }