Skip to content

Commit 638822e

Browse files
committed
DATACMNS-692 - Fixed web parameter range handling for Pageables.
In case the PageableHandlerMethodArgumentResolver was configured to use one-indexed parameters, it wasn't defaulting the lower bounds for the page number. This caused indexes out of the allowed bound submitted causing an invalid index handed tor PageRequest. We now apply better range shifting before the bounds are applied.
1 parent 30ff4b6 commit 638822e

File tree

2 files changed

+25
-9
lines changed

2 files changed

+25
-9
lines changed

src/main/java/org/springframework/data/web/PageableHandlerMethodArgumentResolver.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -224,9 +224,9 @@ public Pageable resolveArgument(MethodParameter methodParameter, ModelAndViewCon
224224
return null;
225225
}
226226

227-
int page = StringUtils.hasText(pageString) ? parseAndApplyBoundaries(pageString, 0, Integer.MAX_VALUE)
228-
- (oneIndexedParameters ? 1 : 0) : defaultOrFallback.getPageNumber();
229-
int pageSize = StringUtils.hasText(pageSizeString) ? parseAndApplyBoundaries(pageSizeString, 0, maxPageSize)
227+
int page = StringUtils.hasText(pageString) ? parseAndApplyBoundaries(pageString, Integer.MAX_VALUE)
228+
: defaultOrFallback.getPageNumber();
229+
int pageSize = StringUtils.hasText(pageSizeString) ? parseAndApplyBoundaries(pageSizeString, maxPageSize)
230230
: defaultOrFallback.getPageSize();
231231

232232
// Limit lower bound
@@ -295,17 +295,16 @@ private static Pageable getDefaultPageRequestFrom(MethodParameter parameter) {
295295
* boundary if the {@link String} cannot be parsed.
296296
*
297297
* @param parameter
298-
* @param lower
299298
* @param upper
300299
* @return
301300
*/
302-
private static int parseAndApplyBoundaries(String parameter, int lower, int upper) {
301+
private int parseAndApplyBoundaries(String parameter, int upper) {
303302

304303
try {
305-
int parsed = Integer.parseInt(parameter);
306-
return parsed < lower ? lower : parsed > upper ? upper : parsed;
304+
int parsed = Integer.parseInt(parameter) - (oneIndexedParameters ? 1 : 0);
305+
return parsed < 0 ? 0 : parsed > upper ? upper : parsed;
307306
} catch (NumberFormatException e) {
308-
return lower;
307+
return 0;
309308
}
310309
}
311310
}

src/test/java/org/springframework/data/web/PageableHandlerMethodArgumentResolverUnitTests.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2013 the original author or authors.
2+
* Copyright 2013-2015 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -236,6 +236,23 @@ public void usesNullSortIfNoDefaultIsConfiguredAndPageAndSizeAreGiven() {
236236
assertThat(result.getSort(), is(nullValue()));
237237
}
238238

239+
/**
240+
* @see DATACMNS-692
241+
*/
242+
@Test
243+
public void oneIndexedParametersDefaultsIndexOutOfRange() {
244+
245+
PageableHandlerMethodArgumentResolver resolver = getResolver();
246+
resolver.setOneIndexedParameters(true);
247+
248+
MockHttpServletRequest request = new MockHttpServletRequest();
249+
request.addParameter("page", "0");
250+
251+
Pageable result = resolver.resolveArgument(supportedMethodParameter, null, new ServletWebRequest(request), null);
252+
253+
assertThat(result.getPageNumber(), is(0));
254+
}
255+
239256
@Override
240257
protected PageableHandlerMethodArgumentResolver getResolver() {
241258
PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();

0 commit comments

Comments
 (0)