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 a72593a7c..23cf5e731 100644 --- a/src/main/java/org/springframework/data/repository/query/Parameters.java +++ b/src/main/java/org/springframework/data/repository/query/Parameters.java @@ -67,6 +67,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); @@ -82,11 +85,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 6a5cd005f..beb19fcd4 100644 --- a/src/test/java/org/springframework/data/repository/query/ParametersUnitTests.java +++ b/src/test/java/org/springframework/data/repository/query/ParametersUnitTests.java @@ -23,6 +23,7 @@ import java.util.Optional; import org.junit.Before; import org.junit.Test; +import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.test.util.ReflectionTestUtils; @@ -161,6 +162,14 @@ public class ParametersUnitTests { assertThat(parameters.getParameter(0).getType(), is(typeCompatibleWith(String.class))); } + @Test // DATACMNS-1383 + public void acceptsCustomPageableParameter() throws Exception { + + Parameters parameters = getParametersFor("customPageable", SomePageable.class); + + assertThat(parameters.hasPageableParameter(), is(true)); + } + private Parameters getParametersFor(String methodName, Class... parameterTypes) throws SecurityException, NoSuchMethodException { @@ -194,5 +203,9 @@ public class ParametersUnitTests { T dynamicBind(Class type, Class one, Class two); void methodWithOptional(Optional optional); + + Page customPageable(SomePageable pageable); } + + interface SomePageable extends Pageable {} }