Skip to content

Commit 4b33129

Browse files
christophstroblmp911de
authored andcommitted
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: spring-projects#851.
1 parent c5501db commit 4b33129

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedAggregation.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import org.bson.Document;
2222

23+
import org.springframework.data.mongodb.InvalidMongoDbApiUsageException;
2324
import org.springframework.data.mongodb.core.MongoOperations;
2425
import org.springframework.data.mongodb.core.aggregation.Aggregation;
2526
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
@@ -71,6 +72,10 @@ public StringBasedAggregation(MongoQueryMethod method, MongoOperations mongoOper
7172
protected Object doExecute(MongoQueryMethod method, ResultProcessor resultProcessor,
7273
ConvertingParameterAccessor accessor, Class<?> typeToRead) {
7374

75+
if (method.isPageQuery() || method.isSliceQuery()) {
76+
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()));
77+
}
78+
7479
Class<?> sourceType = method.getDomainClass();
7580
Class<?> targetType = typeToRead;
7681

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedAggregationUnitTests.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,14 @@
3434
import org.mockito.ArgumentCaptor;
3535
import org.mockito.Mock;
3636
import org.mockito.junit.jupiter.MockitoExtension;
37-
37+
import org.mockito.junit.jupiter.MockitoSettings;
38+
import org.mockito.quality.Strictness;
39+
import org.springframework.data.domain.Page;
40+
import org.springframework.data.domain.PageRequest;
41+
import org.springframework.data.domain.Pageable;
3842
import org.springframework.data.domain.Sort;
3943
import org.springframework.data.domain.Sort.Direction;
44+
import org.springframework.data.mongodb.InvalidMongoDbApiUsageException;
4045
import org.springframework.data.mongodb.core.MongoOperations;
4146
import org.springframework.data.mongodb.core.aggregation.AggregationOperationContext;
4247
import org.springframework.data.mongodb.core.aggregation.AggregationOptions;
@@ -68,6 +73,7 @@
6873
* @author Mark Paluch
6974
*/
7075
@ExtendWith(MockitoExtension.class)
76+
@MockitoSettings(strictness = Strictness.LENIENT)
7177
public class StringBasedAggregationUnitTests {
7278

7379
SpelExpressionParser PARSER = new SpelExpressionParser();
@@ -202,6 +208,16 @@ public void aggregateWithCollationParameter() {
202208
assertThat(collationOf(invocation)).isEqualTo(Collation.of("en_US"));
203209
}
204210

211+
@Test // DATAMONGO-2506
212+
public void aggregateRaisesErrorOnInvalidReturnType() {
213+
214+
StringBasedAggregation sba = createAggregationForMethod("invalidPageReturnType", Pageable.class);
215+
assertThatExceptionOfType(InvalidMongoDbApiUsageException.class) //
216+
.isThrownBy(() -> sba.execute(new Object[] { PageRequest.of(0, 1) })) //
217+
.withMessageContaining("invalidPageReturnType") //
218+
.withMessageContaining("Page");
219+
}
220+
205221
private AggregationInvocation executeAggregation(String name, Object... args) {
206222

207223
Class<?>[] argTypes = Arrays.stream(args).map(Object::getClass).toArray(Class[]::new);
@@ -280,6 +296,9 @@ private interface SampleRepository extends Repository<Person, Long> {
280296

281297
@Aggregation(pipeline = RAW_GROUP_BY_LASTNAME_STRING, collation = "de_AT")
282298
PersonAggregate aggregateWithCollation(Collation collation);
299+
300+
@Aggregation(RAW_GROUP_BY_LASTNAME_STRING)
301+
Page<Person> invalidPageReturnType(Pageable page);
283302
}
284303

285304
static class PersonAggregate {

0 commit comments

Comments
 (0)