diff --git a/src/main/java/org/springframework/data/web/PageableHandlerMethodArgumentResolver.java b/src/main/java/org/springframework/data/web/PageableHandlerMethodArgumentResolver.java index 8e16515d04..7cfdfe16e3 100644 --- a/src/main/java/org/springframework/data/web/PageableHandlerMethodArgumentResolver.java +++ b/src/main/java/org/springframework/data/web/PageableHandlerMethodArgumentResolver.java @@ -26,6 +26,7 @@ import org.springframework.data.domain.Sort; import org.springframework.util.Assert; import org.springframework.util.StringUtils; +import org.springframework.web.bind.ServletRequestBindingException; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; @@ -233,19 +234,26 @@ public Pageable resolveArgument(MethodParameter methodParameter, ModelAndViewCon 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(); - - // Limit lower bound - pageSize = pageSize < 1 ? defaultOrFallback.getPageSize() : pageSize; - // Limit upper bound - pageSize = pageSize > maxPageSize ? maxPageSize : pageSize; - - Sort sort = sortResolver.resolveArgument(methodParameter, mavContainer, webRequest, binderFactory); - return new PageRequest(page, pageSize, sort == null ? defaultOrFallback.getSort() : sort); + + Pageable pageable = null; + try { + int page = StringUtils.hasText(pageString) ? Integer.parseInt(pageString) - (oneIndexedParameters ? 1 : 0) + : defaultOrFallback.getPageNumber(); + int pageSize = StringUtils.hasText(pageSizeString) ? Integer.parseInt(pageSizeString) : defaultOrFallback + .getPageSize(); + + // Limit lower bound + pageSize = pageSize < 1 ? defaultOrFallback.getPageSize() : pageSize; + // Limit upper bound + pageSize = pageSize > maxPageSize ? maxPageSize : pageSize; + + Sort sort = sortResolver.resolveArgument(methodParameter, mavContainer, webRequest, binderFactory); + pageable = new PageRequest(page, pageSize, sort == null ? defaultOrFallback.getSort() : sort); + + } catch (IllegalArgumentException e) { + throw new ServletRequestBindingException(e.getMessage(), e); + } + return pageable; } /** diff --git a/src/test/java/org/springframework/data/web/PageableHandlerMethodArgumentResolverUnitTests.java b/src/test/java/org/springframework/data/web/PageableHandlerMethodArgumentResolverUnitTests.java index 4b14801f2b..6bbe8bfbf2 100644 --- a/src/test/java/org/springframework/data/web/PageableHandlerMethodArgumentResolverUnitTests.java +++ b/src/test/java/org/springframework/data/web/PageableHandlerMethodArgumentResolverUnitTests.java @@ -24,6 +24,7 @@ import org.springframework.data.domain.Sort.Direction; import org.springframework.data.web.SortDefault.SortDefaults; import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.web.bind.ServletRequestBindingException; /** * Unit tests for {@link PageableHandlerMethodArgumentResolver}. Pulls in defaulting tests from @@ -115,6 +116,70 @@ public void rejectsInvalidCustomDefaultForPageSize() throws Exception { assertSupportedAndResult(parameter, PageableHandlerMethodArgumentResolver.DEFAULT_PAGE_REQUEST); } + @Test(expected = ServletRequestBindingException.class) + public void pageParamIsNegative() throws Exception { + + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addParameter("page", "-1"); + + assertSupportedAndResult(supportedMethodParameter, null, request); + } + + @Test(expected = ServletRequestBindingException.class) + public void pageParamIsNotNumeric() throws Exception { + + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addParameter("page", "a"); + + assertSupportedAndResult(supportedMethodParameter, null, request); + } + + @Test(expected = ServletRequestBindingException.class) + public void sizeParamIsNotNumeric() throws Exception { + + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addParameter("size", "a"); + + assertSupportedAndResult(supportedMethodParameter, null, request); + } + + @Test(expected = ServletRequestBindingException.class) + public void sortParamIsEmpty() throws Exception { + + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addParameter("sort", ""); + + assertSupportedAndResult(supportedMethodParameter, null, request); + } + + @Test(expected = ServletRequestBindingException.class) + public void sortParamIsInvalidProperty() throws Exception { + + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addParameter("sort", ",DESC"); + + assertSupportedAndResult(supportedMethodParameter, null, request); + } + + @Test(expected = ServletRequestBindingException.class) + public void sortParamIsInvalidPropertyWhenMultiProperty() throws Exception { + + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addParameter("sort", "property1,,DESC"); + + assertSupportedAndResult(supportedMethodParameter, null, request); + } + + @Test(expected = ServletRequestBindingException.class) + public void sortParamIsEmptyWhenMultiParams() throws Exception { + + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addParameter("sort", "property,DESC"); + request.addParameter("sort", ""); + + assertSupportedAndResult(supportedMethodParameter, null, request); + } + @Override protected PageableHandlerMethodArgumentResolver getResolver() { PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();