From c496605a9fa5d5f705b4de7aae0ca55c0ce4f1c8 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Fri, 3 Nov 2023 13:53:25 +0100 Subject: [PATCH 1/3] Prepare issue branch. --- pom.xml | 2 +- spring-data-mongodb-benchmarks/pom.xml | 2 +- spring-data-mongodb-distribution/pom.xml | 2 +- spring-data-mongodb/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index f4eb82b8bb..ca276b9c07 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 4.2.0-SNAPSHOT + 4.2.x-4546-SNAPSHOT pom Spring Data MongoDB diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml index 2de4b6b635..2dde06c17d 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 - 4.2.0-SNAPSHOT + 4.2.x-4546-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index 41b81f9aa6..d1f4e8467e 100644 --- a/spring-data-mongodb-distribution/pom.xml +++ b/spring-data-mongodb-distribution/pom.xml @@ -15,7 +15,7 @@ org.springframework.data spring-data-mongodb-parent - 4.2.0-SNAPSHOT + 4.2.x-4546-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index d7a9ddaa63..cc54adba7b 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -13,7 +13,7 @@ org.springframework.data spring-data-mongodb-parent - 4.2.0-SNAPSHOT + 4.2.x-4546-SNAPSHOT ../pom.xml From fbc91613b62243473ce73c28db4687002a16388c Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Fri, 3 Nov 2023 13:55:06 +0100 Subject: [PATCH 2/3] Validate String based annotation on query method creation. This commit makes sure to fail early if an annotated string based annotation does not contain a syntactically valid pipeline. --- .../repository/query/MongoQueryMethod.java | 10 ++++++++++ .../query/MongoQueryMethodUnitTests.java | 15 +++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java index 1d01c877b9..4cc111febb 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java @@ -504,6 +504,16 @@ public void verify() { } } } + if (hasAnnotatedAggregation()) { + for (String stage : getAnnotatedAggregation()) { + if (stage.trim().startsWith("[")) { + throw new IllegalStateException(""" + Invalid aggregation pipeline. Please split Aggregation.pipeline from "[{...}, {...}]" to "{...}", "{...}". + Offending Method: %s.%s + """.formatted(method.getDeclaringClass().getSimpleName(), method.getName())); + } + } + } } private boolean isNumericOrVoidReturnValue() { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryMethodUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryMethodUnitTests.java index 8663913007..7799a0fab0 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryMethodUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryMethodUnitTests.java @@ -358,6 +358,15 @@ void detectsReadPreferenceForAggregation() throws Exception { assertThat(method.getAnnotatedReadPreference()).isEqualTo("secondaryPreferred"); } + @Test // GH-4546 + void errorsOnInvalidAggregation() throws Exception { + + assertThatExceptionOfType(IllegalStateException.class) // + .isThrownBy(() -> queryMethod(InvalidAggregationMethodRepo.class, "findByAggregation").verify()) // + .withMessageContaining("Invalid aggregation") // + .withMessageContaining("findByAggregation"); + } + private MongoQueryMethod queryMethod(Class repository, String name, Class... parameters) throws Exception { Method method = repository.getMethod(name, parameters); @@ -465,6 +474,12 @@ interface InvalidUpdateMethodRepo extends Repository { Person findAndIncrementVisitsByFirstname(String firstname); } + interface InvalidAggregationMethodRepo extends Repository { + + @Aggregation("[{'$group': { _id: '$templateId', maxVersion : { $max : '$version'} } }]") + List findByAggregation(); + } + interface Customer { } From 4bf2ff71893becb5082f2ba462dcd86b78329e22 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Mon, 6 Nov 2023 12:15:42 +0100 Subject: [PATCH 3/3] Use BsonUtils to identify arrays. --- .../data/mongodb/repository/query/MongoQueryMethod.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java index 4cc111febb..20e9677905 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java @@ -39,6 +39,7 @@ import org.springframework.data.mongodb.repository.ReadPreference; import org.springframework.data.mongodb.repository.Tailable; import org.springframework.data.mongodb.repository.Update; +import org.springframework.data.mongodb.util.BsonUtils; import org.springframework.data.projection.ProjectionFactory; import org.springframework.data.repository.core.RepositoryMetadata; import org.springframework.data.repository.query.QueryMethod; @@ -506,7 +507,7 @@ public void verify() { } if (hasAnnotatedAggregation()) { for (String stage : getAnnotatedAggregation()) { - if (stage.trim().startsWith("[")) { + if (BsonUtils.isJsonArray(stage)) { throw new IllegalStateException(""" Invalid aggregation pipeline. Please split Aggregation.pipeline from "[{...}, {...}]" to "{...}", "{...}". Offending Method: %s.%s