From f4854a15f923f692588887b4688f5b2701e716a4 Mon Sep 17 00:00:00 2001 From: Heesu Jung Date: Wed, 12 Jun 2019 14:52:43 +0900 Subject: [PATCH] DATAMONGO-2300 - Add check rawType is null in readMap. Original Pull Request: #763 --- .../core/convert/MappingMongoConverter.java | 3 ++- .../MappingMongoConverterUnitTests.java | 19 +++++++++++++++++++ 2 files changed, 21 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 9ee573070..71cdb1eee 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 @@ -76,6 +76,7 @@ import com.mongodb.DBRef; * @author Christoph Strobl * @author Jordi Llach * @author Mark Paluch + * @author Heesu Jung */ public class MappingMongoConverter extends AbstractMongoConverter implements ApplicationContextAware { @@ -1120,7 +1121,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App map.put(key, read(defaultedValueType, (BasicDBObject) value, path)); } else if (value instanceof DBRef) { map.put(key, DBRef.class.equals(rawValueType) ? value - : readAndConvertDBRef((DBRef) value, defaultedValueType, ObjectPath.ROOT, rawValueType)); + : readAndConvertDBRef((DBRef) value, defaultedValueType, ObjectPath.ROOT, rawValueType != null ? rawValueType : ClassTypeInformation.OBJECT.getType())); } else if (value instanceof List) { map.put(key, readCollectionOrArray(valueType != null ? valueType : ClassTypeInformation.LIST, (List) value, path)); 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 600fb8709..df2f48872 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 @@ -82,6 +82,7 @@ import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty; import org.springframework.data.mongodb.core.mapping.PersonPojoStringId; import org.springframework.data.mongodb.core.mapping.TextScore; import org.springframework.data.util.ClassTypeInformation; +import org.springframework.data.util.TypeInformation; import org.springframework.test.util.ReflectionTestUtils; import com.mongodb.BasicDBList; @@ -96,6 +97,7 @@ import com.mongodb.DBRef; * @author Patrik Wasik * @author Christoph Strobl * @author Mark Paluch + * @author Heesu Jung */ @RunWith(MockitoJUnitRunner.class) public class MappingMongoConverterUnitTests { @@ -1938,6 +1940,23 @@ public class MappingMongoConverterUnitTests { .isEqualTo(new BasicDBObject("property", "value")); } + @Test // DATAMONGO-2300 + public void readAndConvertDBRefNestedByMapCorrectly() { + + org.bson.Document cluster = new org.bson.Document("_id", 100L); + DBRef dbRef = new DBRef("clusters", 100L); + + org.bson.Document data = new org.bson.Document("_id", 3L); + data.append("cluster", dbRef); + + MappingMongoConverter spyConverter = spy(converter); + Mockito.doReturn(cluster).when(spyConverter).readRef(dbRef); + + Map result = spyConverter.readMap(ClassTypeInformation.MAP, data, ObjectPath.ROOT); + + assertThat(((LinkedHashMap) result.get("cluster")).get("_id")).isEqualTo(100L); + } + static class GenericType { T content; }