From 52e5cf9a055e95c643941ddd7d0c9a0fa7bf6681 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Mon, 18 Mar 2019 13:55:20 +0100 Subject: [PATCH 1/2] DATAMONGO-2221 - Prepare issue branch. --- pom.xml | 2 +- spring-data-mongodb-benchmarks/pom.xml | 2 +- spring-data-mongodb-cross-store/pom.xml | 4 ++-- spring-data-mongodb-distribution/pom.xml | 2 +- spring-data-mongodb/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index d00702b731..e6e2e182b2 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 2.2.0.BUILD-SNAPSHOT + 2.2.0.DATAMONGO-2221-SNAPSHOT pom Spring Data MongoDB diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml index bb7d9f03cc..b1faa62f0c 100644 --- a/spring-data-mongodb-benchmarks/pom.xml +++ b/spring-data-mongodb-benchmarks/pom.xml @@ -7,7 +7,7 @@ org.springframework.data spring-data-mongodb-parent - 2.2.0.BUILD-SNAPSHOT + 2.2.0.DATAMONGO-2221-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb-cross-store/pom.xml b/spring-data-mongodb-cross-store/pom.xml index d3b7593d37..5a63f97a70 100644 --- a/spring-data-mongodb-cross-store/pom.xml +++ b/spring-data-mongodb-cross-store/pom.xml @@ -6,7 +6,7 @@ org.springframework.data spring-data-mongodb-parent - 2.2.0.BUILD-SNAPSHOT + 2.2.0.DATAMONGO-2221-SNAPSHOT ../pom.xml @@ -50,7 +50,7 @@ org.springframework.data spring-data-mongodb - 2.2.0.BUILD-SNAPSHOT + 2.2.0.DATAMONGO-2221-SNAPSHOT diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index b32dcba387..c282c65d2e 100644 --- a/spring-data-mongodb-distribution/pom.xml +++ b/spring-data-mongodb-distribution/pom.xml @@ -14,7 +14,7 @@ org.springframework.data spring-data-mongodb-parent - 2.2.0.BUILD-SNAPSHOT + 2.2.0.DATAMONGO-2221-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index b611cf01a8..e4c9f5fcba 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -11,7 +11,7 @@ org.springframework.data spring-data-mongodb-parent - 2.2.0.BUILD-SNAPSHOT + 2.2.0.DATAMONGO-2221-SNAPSHOT ../pom.xml From 84df9ccf52a922ea6f3e4cfa0443bd1c83c3c2c8 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 26 Mar 2019 08:11:15 +0100 Subject: [PATCH 2/2] DATAMONGO-2221 - Fix mapping of Strings matching a valid ObjectId for unresolvable paths. We now make sure we do not convert Strings that represent valid ObjectIds into the such for paths that cannot be resolved to a Property. --- .../mongodb/core/convert/QueryMapper.java | 43 +++++++++++++------ .../core/convert/QueryMapperUnitTests.java | 29 +++++++++++++ 2 files changed, 60 insertions(+), 12 deletions(-) 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 f5c43564c3..63a6861548 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 @@ -33,7 +33,6 @@ import org.bson.Document; import org.bson.conversions.Bson; import org.bson.types.ObjectId; - import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.converter.Converter; import org.springframework.data.domain.Example; @@ -952,9 +951,7 @@ public boolean isIdField() { MongoPersistentProperty idProperty = entity.getIdProperty(); if (idProperty != null) { - - return name.equals(idProperty.getName()) || name.equals(idProperty.getFieldName()) - || name.endsWith("." + idProperty.getName()) || name.endsWith("." + idProperty.getFieldName()); + return name.equals(idProperty.getName()) || name.equals(idProperty.getFieldName()); } return DEFAULT_ID_NAMES.contains(name); @@ -1042,16 +1039,15 @@ protected PersistentPropertyPath getPath() { @Nullable private PersistentPropertyPath getPath(String pathExpression) { - try { + String rawPath = pathExpression.replaceAll("\\.\\d+", "") // + .replaceAll(POSITIONAL_OPERATOR.pattern(), ""); - String rawPath = pathExpression.replaceAll("\\.\\d+", "") // - .replaceAll(POSITIONAL_OPERATOR.pattern(), ""); - - PropertyPath path = PropertyPath.from(rawPath, entity.getTypeInformation()); + PropertyPath path = forName(rawPath); + if (path == null || isPathToJavaLangClassProperty(path)) { + return null; + } - if (isPathToJavaLangClassProperty(path)) { - return null; - } + try { PersistentPropertyPath propertyPath = mappingContext.getPersistentPropertyPath(path); @@ -1073,7 +1069,30 @@ private PersistentPropertyPath getPath(String pathExpre } return propertyPath; + } catch (InvalidPersistentPropertyPath e) { + return null; + } + } + + /** + * Querydsl happens to map id fields directly to {@literal _id} which breaks {@link PropertyPath} resolution. So if + * the first attempt fails we try to replace {@literal _id} with just {@literal id} and see if we can resolve if + * then. + * + * @param path + * @return the path or {@literal null} + */ + @Nullable + private PropertyPath forName(String path) { + + try { + return PropertyPath.from(path, entity.getTypeInformation()); } catch (PropertyReferenceException | InvalidPersistentPropertyPath e) { + + if (path.endsWith("_id")) { + return forName(path.substring(0, path.length() - 3) + "id"); + } + return null; } } 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 d0b958880b..e399e399f2 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 @@ -831,6 +831,30 @@ public void shouldNotConvertHexStringToObjectIdForRenamedNestedIdField() { assertThat(document).isEqualTo(new org.bson.Document("nested.id", idHex)); } + @Test // DATAMONGO-2221 + public void shouldNotConvertHexStringToObjectIdForRenamedDeeplyNestedIdField() { + + String idHex = new ObjectId().toHexString(); + Query query = new Query(where("nested.deeplyNested.id").is(idHex)); + + org.bson.Document document = mapper.getMappedObject(query.getQueryObject(), + context.getPersistentEntity(RootForClassWithExplicitlyRenamedIdField.class)); + + assertThat(document).isEqualTo(new org.bson.Document("nested.deeplyNested.id", idHex)); + } + + @Test // DATAMONGO-2221 + public void shouldNotConvertHexStringToObjectIdForUnresolvablePath() { + + String idHex = new ObjectId().toHexString(); + Query query = new Query(where("nested.unresolvablePath.id").is(idHex)); + + org.bson.Document document = mapper.getMappedObject(query.getQueryObject(), + context.getPersistentEntity(RootForClassWithExplicitlyRenamedIdField.class)); + + assertThat(document).isEqualTo(new org.bson.Document("nested.unresolvablePath.id", idHex)); + } + @Document public class Foo { @Id private ObjectId id; @@ -926,6 +950,11 @@ static class RootForClassWithExplicitlyRenamedIdField { static class ClassWithExplicitlyRenamedField { @Field("id") String id; + DeeplyNestedClassWithExplicitlyRenamedField deeplyNested; + } + + static class DeeplyNestedClassWithExplicitlyRenamedField { + @Field("id") String id; } static class ClassWithGeoTypes {