diff --git a/src/main/java/org/springframework/data/web/PageableHandlerMethodArgumentResolverSupport.java b/src/main/java/org/springframework/data/web/PageableHandlerMethodArgumentResolverSupport.java index f195bea16d..e0e8f2df01 100644 --- a/src/main/java/org/springframework/data/web/PageableHandlerMethodArgumentResolverSupport.java +++ b/src/main/java/org/springframework/data/web/PageableHandlerMethodArgumentResolverSupport.java @@ -42,6 +42,7 @@ * * @author Mark Paluch * @author Vedran Pavic + * @author BEN YOUSSEF Hamza * @see ReactivePageableHandlerMethodArgumentResolver * @see PageableHandlerMethodArgumentResolver * @since 2.2 @@ -247,14 +248,14 @@ private Pageable getDefaultFromAnnotationOrFallback(MethodParameter methodParame .get(PageableDefault.class); if (defaults.isPresent()) { - return getDefaultPageRequestFrom(methodParameter, defaults); + return getDefaultPageRequestFrom(methodParameter, defaults, oneIndexedParameters); } return fallbackPageable; } private static Pageable getDefaultPageRequestFrom(MethodParameter parameter, - MergedAnnotation defaults) { + MergedAnnotation defaults, boolean oneIndexedParameters) { int defaultPageNumber = defaults.getInt("page"); int defaultPageSize = defaults.getInt("size"); @@ -264,6 +265,10 @@ private static Pageable getDefaultPageRequestFrom(MethodParameter parameter, throw new IllegalStateException(String.format(INVALID_DEFAULT_PAGE_SIZE, annotatedMethod)); } + if (oneIndexedParameters) { + defaultPageNumber--; + } + String[] sort = defaults.getStringArray("sort"); if (sort.length == 0) { return PageRequest.of(defaultPageNumber, defaultPageSize); diff --git a/src/test/java/org/springframework/data/web/PageableHandlerMethodArgumentResolverUnitTests.java b/src/test/java/org/springframework/data/web/PageableHandlerMethodArgumentResolverUnitTests.java index 3fc8ca30a2..36bafc424e 100755 --- a/src/test/java/org/springframework/data/web/PageableHandlerMethodArgumentResolverUnitTests.java +++ b/src/test/java/org/springframework/data/web/PageableHandlerMethodArgumentResolverUnitTests.java @@ -39,6 +39,7 @@ * @author Vedran Pavic * @author Mark Paluch * @author Yanming Zhou + * @author BEN YOUSSEF Hamza */ class PageableHandlerMethodArgumentResolverUnitTests extends PageableDefaultUnitTests { @@ -258,6 +259,20 @@ void oneIndexedParametersDefaultsIndexOutOfRange() { assertThat(result.getPageNumber()).isEqualTo(0); } + @Test // GH-3483 + void returnCorrectPageNumberOneIndexedParametersDefaults() throws NoSuchMethodException { + + var resolver = getResolver(); + resolver.setOneIndexedParameters(true); + + var oneIndexedDefault = new MethodParameter(Sample.class.getMethod("oneIndexedDefault", Pageable.class), 0); + + var request = new MockHttpServletRequest(); + var result = resolver.resolveArgument(oneIndexedDefault, null, new ServletWebRequest(request), null); + + assertThat(result.getPageNumber()).isEqualTo(0); + } + @Test // DATACMNS-761 void returnsCorrectPageSizeForOneIndexParameters() { @@ -328,6 +343,8 @@ interface Sample { void valuePageSize(@PageableDefault(2) Pageable pageable); + void oneIndexedDefault(@PageableDefault(size = PAGE_SIZE, page = 1) Pageable pageable); + void simpleDefault(@PageableDefault(size = PAGE_SIZE, page = PAGE_NUMBER) Pageable pageable); void simpleDefaultWithSort(