From 4b3312998a9306cbb3bc5a76fea6e8ed597f0610 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 7 Apr 2020 14:23:38 +0200 Subject: [PATCH] DATAMONGO-2506 - Provide meaningful error message when using unsupported return type in repository aggregation method. We improved the error message for unsupported return types instead of running into an IllegalArgumentException for unique results. Original pull request: #851. --- .../query/StringBasedAggregation.java | 5 +++++ .../StringBasedAggregationUnitTests.java | 21 ++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedAggregation.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedAggregation.java index 9709874fe..912f0e3c9 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedAggregation.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedAggregation.java @@ -20,6 +20,7 @@ import java.util.stream.Collectors; import org.bson.Document; +import org.springframework.data.mongodb.InvalidMongoDbApiUsageException; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.AggregationOperation; @@ -71,6 +72,10 @@ public class StringBasedAggregation extends AbstractMongoQuery { protected Object doExecute(MongoQueryMethod method, ResultProcessor resultProcessor, ConvertingParameterAccessor accessor, Class typeToRead) { + if (method.isPageQuery() || method.isSliceQuery()) { + throw new InvalidMongoDbApiUsageException(String.format("Repository aggregation method '%s' does not support '%s' return type. Please use eg. 'List' instead.", method.getName(), method.getReturnType().getType().getSimpleName())); + } + Class sourceType = method.getDomainClass(); Class targetType = typeToRead; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedAggregationUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedAggregationUnitTests.java index 568e455c7..c24701dea 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedAggregationUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedAggregationUnitTests.java @@ -34,9 +34,14 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; +import org.springframework.data.mongodb.InvalidMongoDbApiUsageException; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.aggregation.AggregationOperationContext; import org.springframework.data.mongodb.core.aggregation.AggregationOptions; @@ -68,6 +73,7 @@ import org.springframework.util.ClassUtils; * @author Mark Paluch */ @ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) public class StringBasedAggregationUnitTests { SpelExpressionParser PARSER = new SpelExpressionParser(); @@ -202,6 +208,16 @@ public class StringBasedAggregationUnitTests { assertThat(collationOf(invocation)).isEqualTo(Collation.of("en_US")); } + @Test // DATAMONGO-2506 + public void aggregateRaisesErrorOnInvalidReturnType() { + + StringBasedAggregation sba = createAggregationForMethod("invalidPageReturnType", Pageable.class); + assertThatExceptionOfType(InvalidMongoDbApiUsageException.class) // + .isThrownBy(() -> sba.execute(new Object[] { PageRequest.of(0, 1) })) // + .withMessageContaining("invalidPageReturnType") // + .withMessageContaining("Page"); + } + private AggregationInvocation executeAggregation(String name, Object... args) { Class[] argTypes = Arrays.stream(args).map(Object::getClass).toArray(Class[]::new); @@ -280,6 +296,9 @@ public class StringBasedAggregationUnitTests { @Aggregation(pipeline = RAW_GROUP_BY_LASTNAME_STRING, collation = "de_AT") PersonAggregate aggregateWithCollation(Collation collation); + + @Aggregation(RAW_GROUP_BY_LASTNAME_STRING) + Page invalidPageReturnType(Pageable page); } static class PersonAggregate {