From 10107c7b8163502a7da160dcbe36700e1b078dff Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Thu, 3 Jan 2019 10:55:36 +0100 Subject: [PATCH] DATAMONGO-2168 - Do not map type key in QueryMapper. QueryMapper now excludes the type key in during mapping and retains the value as-is. This change fixes an issue in which type keys were attempted to be mapped using the entity model. Type key resolution for _class failed silently while other type keys such as className failed in property path resolution and the failure became visible. Original Pull Request: #631 --- .../data/mongodb/core/convert/QueryMapper.java | 17 +++++++++++++++++ .../core/convert/QueryMapperUnitTests.java | 12 ++++++++++++ 2 files changed, 29 insertions(+) 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 48b02a0aa..fec0b0030 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 @@ -127,6 +127,11 @@ public class QueryMapper { continue; } + if (isTypeKey(key)) { + result.put(key, BsonUtils.get(query, key)); + continue; + } + if (isKeyword(key)) { result.putAll(getMappedKeyword(new Keyword(query, key), entity)); continue; @@ -605,6 +610,18 @@ public class QueryMapper { return isKeyword(keys.iterator().next().toString()); } + /** + * Returns whether the given {@link String} is the type key. + * + * @param key + * @return + * @see MongoTypeMapper#isTypeKey(String) + * @since 2.2 + */ + protected boolean isTypeKey(String key) { + return converter.getTypeMapper().isTypeKey(key); + } + /** * Returns whether the given {@link String} is a MongoDB keyword. The default implementation will check against the * set of registered keywords returned by {@link #getKeywords()}. 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 b13361cc5..4baa5d178 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 @@ -55,6 +55,7 @@ import org.springframework.data.mongodb.core.mapping.TextScore; import org.springframework.data.mongodb.core.query.BasicQuery; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.test.util.Assertions; import org.springframework.data.mongodb.test.util.BasicDbListBuilder; import com.mongodb.BasicDBObject; @@ -803,6 +804,17 @@ public class QueryMapperUnitTests { assertThat(document.get("sample._id"), instanceOf(String.class)); } + @Test // DATAMONGO-2168 + public void getMappedObjectShouldNotMapTypeHint() { + + converter.setTypeMapper(new DefaultMongoTypeMapper("className")); + + org.bson.Document update = new org.bson.Document("className", "foo"); + org.bson.Document mappedObject = mapper.getMappedObject(update, context.getPersistentEntity(UserEntity.class)); + + Assertions.assertThat(mappedObject).containsEntry("className", "foo"); + } + @Document public class Foo { @Id private ObjectId id;