From 1d4a53dc28c081ef9db9ea82a746d6aff172d405 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Thu, 30 Aug 2018 15:40:41 +0200 Subject: [PATCH] DATACMNS-1383 - Parameters now properly detects Pageable and Sort extensions. One of the constructors of Pageable wasn't properly checking for assignability of Pageable parameters to detect them but was expecting Pageable itself being used under all circumstances. This has now been opened up by an assignability check. --- .../data/repository/query/Parameters.java | 15 +++++++++++++-- .../repository/query/ParametersUnitTests.java | 15 ++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/springframework/data/repository/query/Parameters.java b/src/main/java/org/springframework/data/repository/query/Parameters.java index e36b5d9bf..69349da28 100644 --- a/src/main/java/org/springframework/data/repository/query/Parameters.java +++ b/src/main/java/org/springframework/data/repository/query/Parameters.java @@ -68,6 +68,9 @@ public abstract class Parameters, T extends Parameter this.parameters = new ArrayList<>(types.size()); this.dynamicProjectionIndex = -1; + int pageableIndex = -1; + int sortIndex = -1; + for (int i = 0; i < types.size(); i++) { MethodParameter methodParameter = new MethodParameter(method, i); @@ -83,11 +86,19 @@ public abstract class Parameters, T extends Parameter this.dynamicProjectionIndex = parameter.getIndex(); } + if (Pageable.class.isAssignableFrom(parameter.getType())) { + pageableIndex = i; + } + + if (Sort.class.isAssignableFrom(parameter.getType())) { + sortIndex = i; + } + parameters.add(parameter); } - this.pageableIndex = types.indexOf(Pageable.class); - this.sortIndex = types.indexOf(Sort.class); + this.pageableIndex = pageableIndex; + this.sortIndex = sortIndex; assertEitherAllParamAnnotatedOrNone(); } diff --git a/src/test/java/org/springframework/data/repository/query/ParametersUnitTests.java b/src/test/java/org/springframework/data/repository/query/ParametersUnitTests.java index 8f53c07b8..a8d634157 100755 --- a/src/test/java/org/springframework/data/repository/query/ParametersUnitTests.java +++ b/src/test/java/org/springframework/data/repository/query/ParametersUnitTests.java @@ -18,13 +18,14 @@ package org.springframework.data.repository.query; import static org.assertj.core.api.Assertions.*; import rx.Single; +import scala.collection.mutable.Publisher; import java.lang.reflect.Method; import java.util.Optional; import org.junit.Before; import org.junit.Test; -import org.reactivestreams.Publisher; +import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.test.util.ReflectionTestUtils; @@ -180,6 +181,14 @@ public class ParametersUnitTests { assertThat(parameters.getParameter(0).getType()).isAssignableFrom(Single.class); } + @Test // DATACMNS-1383 + public void acceptsCustomPageableParameter() throws Exception { + + Parameters parameters = getParametersFor("customPageable", SomePageable.class); + + assertThat(parameters.hasPageableParameter()).isTrue(); + } + private Parameters getParametersFor(String methodName, Class... parameterTypes) throws SecurityException, NoSuchMethodException { @@ -217,5 +226,9 @@ public class ParametersUnitTests { void methodWithPublisher(Publisher publisher); void methodWithSingle(Single single); + + Page customPageable(SomePageable pageable); } + + interface SomePageable extends Pageable {} }