From 95245015bc605d35c9f5408c12ebf06f5c262101 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Fri, 26 Aug 2011 13:44:47 +0200 Subject: [PATCH] DATADOC-245 - Default to custom target type if raw type is null. Really only use the custom target type in case it is a real subtype of the basic one. Before that we used the plain custom one which was is lacking generics information potentially available in the basic one. --- .../core/convert/MappingMongoConverter.java | 2 +- .../MappingMongoConverterUnitTests.java | 43 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) 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 f159a73a1..36f062841 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 @@ -851,7 +851,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App Class documentsTargetType = getDefaultedTypeToBeUsed(dbObject); Class rawType = basicType == null ? null : basicType.getType(); - boolean isMoreConcreteCustomType = rawType == null ? false : rawType.isAssignableFrom(documentsTargetType); + boolean isMoreConcreteCustomType = rawType == null ? true : rawType.isAssignableFrom(documentsTargetType) && !rawType.equals(documentsTargetType); return isMoreConcreteCustomType ? (TypeInformation) ClassTypeInformation.from(documentsTargetType) : basicType; } 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 5b546e917..8d404919e 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 @@ -624,6 +624,49 @@ public class MappingMongoConverterUnitTests { assertThat((String)((Map) firstObjectInFoo).get("Hello"), is(equalTo("World"))); } + + /** + * @see DATADOC-245 + */ + @Test + public void readsMapDoublyNestedValuesCorrectly() { + + BasicDBObject nested = new BasicDBObject(); + BasicDBObject doubly = new BasicDBObject(); + doubly.append("Hello", "World"); + nested.append("nested", doubly); + DBObject source = new BasicDBObject("mapOfObjects", new BasicDBObject("Foo", nested)); + + ClassWithMapProperty result = converter.read(ClassWithMapProperty.class, source); + Object foo = result.mapOfObjects.get("Foo"); + assertThat(foo, is(instanceOf(Map.class))); + Object doublyNestedObject = ((Map) foo).get("nested"); + assertThat(doublyNestedObject, is(instanceOf(Map.class))); + assertThat((String) ((Map) doublyNestedObject).get("Hello"), is(equalTo("World"))); + } + + /** + * @see DATADOC-245 + */ + @Test + public void readsMapListDoublyNestedValuesCorrectly() { + + BasicDBList list = new BasicDBList(); + BasicDBObject nested = new BasicDBObject(); + BasicDBObject doubly = new BasicDBObject(); + doubly.append("Hello", "World"); + nested.append("nested", doubly); + list.add(nested); + DBObject source = new BasicDBObject("mapOfObjects", new BasicDBObject("Foo", list)); + + ClassWithMapProperty result = converter.read(ClassWithMapProperty.class, source); + Object firstObjectInFoo = ((List) result.mapOfObjects.get("Foo")).get(0); + assertThat(firstObjectInFoo, is(instanceOf(Map.class))); + Object doublyNestedObject = ((Map) firstObjectInFoo).get("nested"); + assertThat(doublyNestedObject, is(instanceOf(Map.class))); + assertThat((String) ((Map) doublyNestedObject).get("Hello"), is(equalTo("World"))); + } + class GenericType { T content; }