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 {} }