From f33f57b88784fb765d2ff6f022267dfc65808316 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 26 Mar 2014 18:15:16 +0100 Subject: [PATCH] DATACMNS-477 - PageableHandlerMethodArgumentResolver now handles null default. We now explicitly check for the configured default being null and subsequently return that value if we don't have both the page and the size parameter configured. --- ...PageableHandlerMethodArgumentResolver.java | 10 +++- .../data/web/PageableDefaultUnitTests.java | 10 +++- ...andlerMethodArgumentResolverUnitTests.java | 48 +++++++++++++++++++ 3 files changed, 65 insertions(+), 3 deletions(-) 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();