From ee5b26ab1c33c1c47a9d88675d4cc9ef753b8879 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Mon, 7 Jan 2019 12:30:00 +0100 Subject: [PATCH] DATAMONGO-2168 - Polishing. MetadataBackedField no longer fails when Path detects reference to field within java.lang.Class. This can happen when splitting the property name via camel case where the first part matches to class which resolves to the getClass() call on java.lang.Object. When then the 2nd part also maps to a method (like getName()) on Class an error would be thrown. Original Pull Request: #631 --- .../data/mongodb/core/convert/QueryMapper.java | 13 +++++++++++++ .../mongodb/core/convert/QueryMapperUnitTests.java | 11 ++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) 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 fec0b0030..29ccd28a0 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 @@ -1004,6 +1004,11 @@ public class QueryMapper { try { PropertyPath path = PropertyPath.from(pathExpression.replaceAll("\\.\\d+", ""), entity.getTypeInformation()); + + if (isPathToJavaLangClassProperty(path)) { + return null; + } + PersistentPropertyPath propertyPath = mappingContext.getPersistentPropertyPath(path); Iterator iterator = propertyPath.iterator(); @@ -1029,6 +1034,14 @@ public class QueryMapper { } } + private boolean isPathToJavaLangClassProperty(PropertyPath path) { + + if (path.getType().equals(Class.class) && path.getLeafProperty().getOwningType().getType().equals(Class.class)) { + return true; + } + return false; + } + /** * Return the {@link Converter} to be used to created the mapped key. Default implementation will use * {@link PropertyToFieldNameConverter}. 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 f8dc609f6..caaec117e 100755 --- 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 @@ -810,6 +810,15 @@ public class QueryMapperUnitTests { assertThat(mappedObject).containsEntry("className", "foo"); } + @Test // DATAMONGO-2168 + public void getMappedObjectShouldIgnorePathsLeadingToJavaLangClassProperties/* like Class#getName() */() { + + org.bson.Document update = new org.bson.Document("className", "foo"); + org.bson.Document mappedObject = mapper.getMappedObject(update, context.getPersistentEntity(UserEntity.class)); + + assertThat(mappedObject).containsEntry("className", "foo"); + } + @Document public class Foo { @Id private ObjectId id; @@ -855,7 +864,7 @@ public class QueryMapperUnitTests { class UserEntity { String id; - List publishers = new ArrayList(); + List publishers = new ArrayList<>(); } class CustomizedField {