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 {