From 0f1536f136926e5f39fbdbe2a203ef6b6cab1065 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 af2e6f1ed..31cf07052 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 @@ -1028,6 +1028,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(); @@ -1053,6 +1058,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 6272dd0ea..1c0262900 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 {