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

@@ -15,6 +15,8 @@
*/
package org.springframework.data.web;
import static org.springframework.data.web.PageableHandlerMethodArgumentResolver.*;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Qualifier;
@@ -97,8 +99,7 @@ public class PageableHandlerMethodArgumentResolverUnitTests extends PageableDefa
request.addParameter("page", "0");
request.addParameter("size", "0");
assertSupportedAndResult(supportedMethodParameter, PageableHandlerMethodArgumentResolver.DEFAULT_PAGE_REQUEST,
request);
assertSupportedAndResult(supportedMethodParameter, DEFAULT_PAGE_REQUEST, request);
}
/**
@@ -112,7 +113,43 @@ public class PageableHandlerMethodArgumentResolverUnitTests extends PageableDefa
exception.expect(IllegalStateException.class);
exception.expectMessage("invalidDefaultPageSize");
assertSupportedAndResult(parameter, PageableHandlerMethodArgumentResolver.DEFAULT_PAGE_REQUEST);
assertSupportedAndResult(parameter, DEFAULT_PAGE_REQUEST);
}
/**
* @see DATACMNS-408
*/
@Test
public void fallsBackToFirstPageIfNegativePageNumberIsGiven() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("page", "-1");
assertSupportedAndResult(supportedMethodParameter, DEFAULT_PAGE_REQUEST, request);
}
/**
* @see DATACMNS-408
*/
@Test
public void pageParamIsNotNumeric() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("page", "a");
assertSupportedAndResult(supportedMethodParameter, DEFAULT_PAGE_REQUEST, request);
}
/**
* @see DATACMNS-408
*/
@Test
public void sizeParamIsNotNumeric() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("size", "a");
assertSupportedAndResult(supportedMethodParameter, DEFAULT_PAGE_REQUEST, request);
}
@Override

View File

@@ -17,7 +17,11 @@ package org.springframework.data.web;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.springframework.data.domain.Sort.Direction.*;
import javax.servlet.http.HttpServletRequest;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.MethodParameter;
@@ -40,6 +44,13 @@ import org.springframework.web.context.request.ServletWebRequest;
*/
public class SortHandlerMethodArgumentResolverUnitTests extends SortDefaultUnitTests {
static MethodParameter PARAMETER;
@BeforeClass
public static void setUp() throws Exception {
PARAMETER = new MethodParameter(Controller.class.getMethod("supportedMethod", Sort.class), 0);
}
/**
* @see DATACMNS-351
*/
@@ -126,6 +137,61 @@ public class SortHandlerMethodArgumentResolverUnitTests extends SortDefaultUnitT
assertThat(result, is(new Sort(Direction.ASC, "firstname", "lastname")));
}
/**
* @see DATACMNS-408
*/
@Test
public void parsesEmptySortToNull() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("sort", "");
assertThat(resolveSort(request, PARAMETER), is(nullValue()));
}
/**
* @see DATACMNS-408
*/
@Test
public void sortParamIsInvalidProperty() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("sort", ",DESC");
assertThat(resolveSort(request, PARAMETER), is(nullValue()));
}
/**
* @see DATACMNS-408
*/
@Test
public void sortParamIsInvalidPropertyWhenMultiProperty() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("sort", "property1,,DESC");
assertThat(resolveSort(request, PARAMETER), is(new Sort(DESC, "property1")));
}
/**
* @see DATACMNS-408
*/
@Test
public void sortParamIsEmptyWhenMultiParams() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("sort", "property,DESC");
request.addParameter("sort", "");
assertThat(resolveSort(request, PARAMETER), is(new Sort(DESC, "property")));
}
private static Sort resolveSort(HttpServletRequest request, MethodParameter parameter) throws Exception {
SortHandlerMethodArgumentResolver resolver = new SortHandlerMethodArgumentResolver();
return resolver.resolveArgument(parameter, null, new ServletWebRequest(request), null);
}
private static void assertSupportedAndResolvedTo(NativeWebRequest request, MethodParameter parameter, Sort sort) {
SortHandlerMethodArgumentResolver resolver = new SortHandlerMethodArgumentResolver();