diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java index d0b8e6505..39bc434e8 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java @@ -41,6 +41,7 @@ import com.mongodb.DBRef; * * @author Jon Brisbin * @author Oliver Gierke + * @author Patryk Wasik */ public class QueryMapper { @@ -267,6 +268,16 @@ public class QueryMapper { return result; } + if (property.isMap()) { + BasicDBObject result = new BasicDBObject(); + DBObject dbObject = (DBObject) source; + for (String key : dbObject.keySet()) { + Object o = dbObject.get(key); + result.put(key, o instanceof DBRef ? o : converter.toDBRef(o, property)); + } + return result; + } + return source == null || source instanceof DBRef ? source : converter.toDBRef(source, property); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java index 742869326..0abb15ed9 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java @@ -25,6 +25,7 @@ import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; import org.bson.types.ObjectId; import org.junit.Before; @@ -53,6 +54,7 @@ import com.mongodb.QueryBuilder; * Unit tests for {@link QueryMapper}. * * @author Oliver Gierke + * @author Patryk Wasik */ @RunWith(MockitoJUnitRunner.class) public class QueryMapperUnitTests { @@ -363,6 +365,25 @@ public class QueryMapperUnitTests { assertThat(object.containsField("_id"), is(false)); } + /** + * @see DATAMONGO-677 + */ + @Test + public void handleMapWithDBRefCorrectly() { + + DBObject mapDbObject = new BasicDBObject(); + mapDbObject.put("test", new com.mongodb.DBRef(null, "test", "test")); + DBObject dbObject = new BasicDBObject(); + dbObject.put("mapWithDBRef", mapDbObject); + + DBObject mapped = mapper.getMappedObject(dbObject, context.getPersistentEntity(WithMapDBRef.class)); + + assertThat(mapped.containsField("mapWithDBRef"), is(true)); + assertThat(mapped.get("mapWithDBRef"), instanceOf(BasicDBObject.class)); + assertThat(((BasicDBObject) mapped.get("mapWithDBRef")).containsField("test"), is(true)); + assertThat(((BasicDBObject) mapped.get("mapWithDBRef")).get("test"), instanceOf(com.mongodb.DBRef.class)); + } + class IdWrapper { Object id; } @@ -415,4 +436,10 @@ public class QueryMapperUnitTests { WithDBRef withDbRef; } + + class WithMapDBRef { + + @DBRef + Map mapWithDBRef; + } }