diff --git a/src/main/java/org/springframework/data/web/PageableHandlerMethodArgumentResolver.java b/src/main/java/org/springframework/data/web/PageableHandlerMethodArgumentResolver.java index cb597f31e..b4b6559e4 100644 --- a/src/main/java/org/springframework/data/web/PageableHandlerMethodArgumentResolver.java +++ b/src/main/java/org/springframework/data/web/PageableHandlerMethodArgumentResolver.java @@ -82,7 +82,9 @@ public class PageableHandlerMethodArgumentResolver implements HandlerMethodArgum * resolved. *

* If you set this to {@literal null}, be aware that you controller methods will get {@literal null} handed into them - * in case no {@link Pageable} data can be found in the request. + * in case no {@link Pageable} data can be found in the request. Note, that doing so will require you supply bot the + * page and the size parameter with the requests as there will be no default for any of the parameters + * available. * * @param fallbackPageable the {@link Pageable} to be used as general fallback. */ @@ -216,6 +218,12 @@ public class PageableHandlerMethodArgumentResolver implements HandlerMethodArgum String pageString = webRequest.getParameter(getParameterNameToUse(pageParameterName, methodParameter)); String pageSizeString = webRequest.getParameter(getParameterNameToUse(sizeParameterName, methodParameter)); + boolean pageAndSizeGiven = StringUtils.hasText(pageString) && StringUtils.hasText(pageSizeString); + + if (!pageAndSizeGiven && defaultOrFallback == null) { + return null; + } + 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) diff --git a/src/test/java/org/springframework/data/web/PageableDefaultUnitTests.java b/src/test/java/org/springframework/data/web/PageableDefaultUnitTests.java index ac4a533bf..3987e2ce7 100644 --- a/src/test/java/org/springframework/data/web/PageableDefaultUnitTests.java +++ b/src/test/java/org/springframework/data/web/PageableDefaultUnitTests.java @@ -51,7 +51,8 @@ public abstract class PageableDefaultUnitTests { static final AbstractPageRequest REFERENCE_WITHOUT_SORT = new PageRequest(PAGE_NUMBER, PAGE_SIZE); static final AbstractPageRequest REFERENCE_WITH_SORT = new PageRequest(PAGE_NUMBER, PAGE_SIZE, SORT); - static final AbstractPageRequest REFERENCE_WITH_SORT_FIELDS = new PageRequest(PAGE_NUMBER, PAGE_SIZE, new Sort(SORT_FIELDS)); + static final AbstractPageRequest REFERENCE_WITH_SORT_FIELDS = new PageRequest(PAGE_NUMBER, PAGE_SIZE, new Sort( + SORT_FIELDS)); @Rule public ExpectedException exception = ExpectedException.none(); @@ -140,7 +141,12 @@ public abstract class PageableDefaultUnitTests { protected void assertSupportedAndResult(MethodParameter parameter, Pageable pageable, NativeWebRequest request) throws Exception { - HandlerMethodArgumentResolver resolver = getResolver(); + assertSupportedAndResult(parameter, pageable, request, getResolver()); + } + + protected void assertSupportedAndResult(MethodParameter parameter, Pageable pageable, NativeWebRequest request, + HandlerMethodArgumentResolver resolver) throws Exception { + assertThat(resolver.supportsParameter(parameter), is(true)); assertThat(resolver.resolveArgument(parameter, null, request, null), is((Object) pageable)); } diff --git a/src/test/java/org/springframework/data/web/PageableHandlerMethodArgumentResolverUnitTests.java b/src/test/java/org/springframework/data/web/PageableHandlerMethodArgumentResolverUnitTests.java index 0e27ed6b6..8e7f20398 100644 --- a/src/test/java/org/springframework/data/web/PageableHandlerMethodArgumentResolverUnitTests.java +++ b/src/test/java/org/springframework/data/web/PageableHandlerMethodArgumentResolverUnitTests.java @@ -15,6 +15,8 @@ */ package org.springframework.data.web; +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; import static org.springframework.data.web.PageableHandlerMethodArgumentResolver.*; import org.junit.Before; @@ -26,6 +28,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort.Direction; import org.springframework.data.web.SortDefault.SortDefaults; import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.web.context.request.ServletWebRequest; /** * Unit tests for {@link PageableHandlerMethodArgumentResolver}. Pulls in defaulting tests from @@ -152,6 +155,51 @@ public class PageableHandlerMethodArgumentResolverUnitTests extends PageableDefa assertSupportedAndResult(supportedMethodParameter, DEFAULT_PAGE_REQUEST, request); } + /** + * @see DATACMNS-477 + */ + @Test + public void returnsNullIfFallbackIsNullAndNoParametersGiven() throws Exception { + + PageableHandlerMethodArgumentResolver resolver = getResolver(); + resolver.setFallbackPageable(null); + + assertSupportedAndResult(supportedMethodParameter, null, new ServletWebRequest(new MockHttpServletRequest()), + resolver); + } + + /** + * @see DATACMNS-477 + */ + @Test + public void returnsNullIfFallbackIsNullAndOnlyPageIsGiven() throws Exception { + + PageableHandlerMethodArgumentResolver resolver = getResolver(); + resolver.setFallbackPageable(null); + + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addParameter("page", "20"); + + assertThat(resolver.resolveArgument(supportedMethodParameter, null, new ServletWebRequest(request), null), + is(nullValue())); + } + + /** + * @see DATACMNS-477 + */ + @Test + public void returnsNullIfFallbackIsNullAndOnlySizeIsGiven() throws Exception { + + PageableHandlerMethodArgumentResolver resolver = getResolver(); + resolver.setFallbackPageable(null); + + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addParameter("size", "10"); + + assertThat(resolver.resolveArgument(supportedMethodParameter, null, new ServletWebRequest(request), null), + is(nullValue())); + } + @Override protected PageableHandlerMethodArgumentResolver getResolver() { PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();