diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/convert/MappingMongoConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/convert/MappingMongoConverter.java index 8d49acf7b..ee5a63301 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/convert/MappingMongoConverter.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/convert/MappingMongoConverter.java @@ -630,16 +630,20 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App // We have to find a potentially stored class to be used first. Class toType = findTypeToBeUsed((DBObject) dbObj); - Map m = new LinkedHashMap(); + Map m = new LinkedHashMap(); for (Map.Entry entry : ((Map) ((DBObject) dbObj).toMap()).entrySet()) { if (entry.getKey().equals(CUSTOM_TYPE_KEY)) { continue; } + + Class keyType = prop.getComponentType(); + Object key = conversionService.convert(entry.getKey(), keyType); + if (null != entry.getValue() && entry.getValue() instanceof DBObject) { - m.put(entry.getKey(), read((null != toType ? toType : prop.getMapValueType()), (DBObject) entry.getValue())); + m.put(key, read((null != toType ? toType : prop.getMapValueType()), (DBObject) entry.getValue())); } else { - m.put(entry.getKey(), entry.getValue()); + m.put(key, entry.getValue()); } } return m; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/MappingMongoConverterUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/MappingMongoConverterUnitTests.java index bdddc357b..2d26cd66d 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/MappingMongoConverterUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/MappingMongoConverterUnitTests.java @@ -99,7 +99,7 @@ public class MappingMongoConverterUnitTests { * @see DATADOC-130 */ @Test - public void convertsMapTypeCorrectly() { + public void writesMapTypeCorrectly() { Map map = Collections.singletonMap(Locale.US, "Foo"); @@ -109,6 +109,19 @@ public class MappingMongoConverterUnitTests { assertThat(dbObject.get(Locale.US.toString()).toString(), is("Foo")); } + /** + * @see DATADOC-130 + */ + @Test + public void readsMapWithCustomKeyTypeCorrectly() { + + DBObject mapObject = new BasicDBObject(Locale.US.toString(), "Value"); + DBObject dbObject = new BasicDBObject("map", mapObject); + + ClassWithMapProperty result = converter.read(ClassWithMapProperty.class, dbObject); + assertThat(result.map.get(Locale.US), is("Value")); + } + /** * @see DATADOC-128 */ @@ -162,6 +175,10 @@ public class MappingMongoConverterUnitTests { LocalDate birthDate; } + static class ClassWithMapProperty { + Map map; + } + public static class BirthDateContainer { LocalDate birthDate; }