From 17b9d5258bd3df034b1ff32c53ae95c3232a3d71 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. $ Conflicts: $ src/test/java/org/springframework/data/repository/query/ParametersUnitTests.java --- .../data/repository/query/Parameters.java | 15 +++++++++++++-- .../repository/query/ParametersUnitTests.java | 13 +++++++++++++ 2 files changed, 26 insertions(+), 2 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 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 {} }