DATACMNS-408 - Handle invalid pagination and sorting parameters gracefully.

The PageableHandlerMethodArgumentResolver and SortHandlerMethodArgumentResolver now transparently ignore invalid values provided for page number, size and sort. We fall back to ignore the invalid values (for sort) and fall back to the defaults where appropriate (page number and size).

Used and adapted test cases from pull request #48.
This commit is contained in:
Oliver Gierke
2013-10-09 02:19:09 +09:00
parent 62e14d2b12
commit cc4a4de892
4 changed files with 136 additions and 8 deletions

View File

@@ -234,10 +234,10 @@ public class PageableHandlerMethodArgumentResolver implements HandlerMethodArgum
String pageString = webRequest.getParameter(getParameterNameToUse(pageParameterName, methodParameter));
String pageSizeString = webRequest.getParameter(getParameterNameToUse(sizeParameterName, methodParameter));
int page = StringUtils.hasText(pageString) ? Integer.parseInt(pageString) - (oneIndexedParameters ? 1 : 0)
: defaultOrFallback.getPageNumber();
int pageSize = StringUtils.hasText(pageSizeString) ? Integer.parseInt(pageSizeString) : defaultOrFallback
.getPageSize();
int page = StringUtils.hasText(pageString) ? parseAndApplyBoundaries(pageString, 0, Integer.MAX_VALUE)
- (oneIndexedParameters ? 1 : 0) : defaultOrFallback.getPageNumber();
int pageSize = StringUtils.hasText(pageSizeString) ? parseAndApplyBoundaries(pageSizeString, 0, maxPageSize)
: defaultOrFallback.getPageSize();
// Limit lower bound
pageSize = pageSize < 1 ? defaultOrFallback.getPageSize() : pageSize;
@@ -301,4 +301,23 @@ public class PageableHandlerMethodArgumentResolver implements HandlerMethodArgum
return new PageRequest(defaultPageNumber, defaultPageSize, defaults.direction(), defaults.sort());
}
/**
* Tries to parse the given {@link String} into an integer and applies the given boundaries. Will return the lower
* boundary if the {@link String} cannot be parsed.
*
* @param parameter
* @param lower
* @param upper
* @return
*/
private static int parseAndApplyBoundaries(String parameter, int lower, int upper) {
try {
int parsed = Integer.parseInt(parameter);
return parsed < lower ? lower : parsed > upper ? upper : parsed;
} catch (NumberFormatException e) {
return lower;
}
}
}

View File

@@ -251,7 +251,13 @@ public class SortHandlerMethodArgumentResolver implements HandlerMethodArgumentR
continue;
}
allOrders.add(new Order(direction, elements[i]));
String property = elements[i];
if (!StringUtils.hasText(property)) {
continue;
}
allOrders.add(new Order(direction, property));
}
}