Skip to content

Commit 47ab7df

Browse files
committed
Skip applying Sort if Pageable is unpaged
Fix java.lang.UnsupportedOperationException at org.springframework.data.domain.Unpaged.getPageNumber(Unpaged.java) at org.springframework.data.web.ReactivePageableHandlerMethodArgumentResolver.resolveArgumentValue(ReactivePageableHandlerMethodArgumentResolver.java)
1 parent 6ca3170 commit 47ab7df

File tree

4 files changed

+42
-6
lines changed

4 files changed

+42
-6
lines changed

src/main/java/org/springframework/data/web/PageableHandlerMethodArgumentResolver.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
* @author Nick Williams
3535
* @author Mark Paluch
3636
* @author Christoph Strobl
37+
* @author Yanming Zhou
3738
*/
3839
public class PageableHandlerMethodArgumentResolver extends PageableHandlerMethodArgumentResolverSupport
3940
implements PageableArgumentResolver {
@@ -79,11 +80,13 @@ public Pageable resolveArgument(MethodParameter methodParameter, @Nullable Model
7980
String page = webRequest.getParameter(getParameterNameToUse(getPageParameterName(), methodParameter));
8081
String pageSize = webRequest.getParameter(getParameterNameToUse(getSizeParameterName(), methodParameter));
8182

82-
Sort sort = sortResolver.resolveArgument(methodParameter, mavContainer, webRequest, binderFactory);
8383
Pageable pageable = getPageable(methodParameter, page, pageSize);
8484

85-
if (sort.isSorted()) {
86-
return PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), sort);
85+
if (pageable.isPaged()) {
86+
Sort sort = sortResolver.resolveArgument(methodParameter, mavContainer, webRequest, binderFactory);
87+
if (sort.isSorted()) {
88+
pageable = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), sort);
89+
}
8790
}
8891

8992
return pageable;

src/main/java/org/springframework/data/web/ReactivePageableHandlerMethodArgumentResolver.java

+9-3
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
*
3434
* @since 2.2
3535
* @author Mark Paluch
36+
* @author Yanming Zhou
3637
*/
3738
public class ReactivePageableHandlerMethodArgumentResolver extends PageableHandlerMethodArgumentResolverSupport
3839
implements SyncHandlerMethodArgumentResolver {
@@ -74,10 +75,15 @@ public Pageable resolveArgumentValue(MethodParameter parameter, BindingContext b
7475
String page = queryParams.getFirst(getParameterNameToUse(getPageParameterName(), parameter));
7576
String pageSize = queryParams.getFirst(getParameterNameToUse(getSizeParameterName(), parameter));
7677

77-
Sort sort = sortResolver.resolveArgumentValue(parameter, bindingContext, exchange);
78-
7978
Pageable pageable = getPageable(parameter, page, pageSize);
8079

81-
return sort.isSorted() ? PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), sort) : pageable;
80+
if (pageable.isPaged()) {
81+
Sort sort = sortResolver.resolveArgumentValue(parameter, bindingContext, exchange);
82+
if (sort.isSorted()) {
83+
pageable = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), sort);
84+
}
85+
}
86+
87+
return pageable;
8288
}
8389
}

src/test/java/org/springframework/data/web/PageableHandlerMethodArgumentResolverUnitTests.java

+15
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
* @author Nick Williams
3838
* @author Vedran Pavic
3939
* @author Mark Paluch
40+
* @author Yanming Zhou
4041
*/
4142
class PageableHandlerMethodArgumentResolverUnitTests extends PageableDefaultUnitTests {
4243

@@ -171,6 +172,20 @@ void returnsFallbackIfOnlyPageIsGiven() throws Exception {
171172
.isEqualTo(Pageable.unpaged());
172173
}
173174

175+
@Test
176+
void returnsFallbackIfOnlyPageAndSortIsGiven() throws Exception {
177+
178+
var resolver = getResolver();
179+
resolver.setFallbackPageable(Pageable.unpaged());
180+
181+
var request = new MockHttpServletRequest();
182+
request.addParameter("page", "20");
183+
request.addParameter("sort", "foo");
184+
185+
assertThat(resolver.resolveArgument(supportedMethodParameter, null, new ServletWebRequest(request), null))
186+
.isEqualTo(Pageable.unpaged());
187+
}
188+
174189
@Test // DATACMNS-477
175190
void returnsFallbackIfFallbackIsUnpagedAndOnlySizeIsGiven() throws Exception {
176191

src/test/java/org/springframework/data/web/ReactivePageableHandlerMethodArgumentResolverUnitTests.java

+12
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
* Unit tests for {@link ReactivePageableHandlerMethodArgumentResolver}.
3636
*
3737
* @author Mark Paluch
38+
* @author Yanming Zhou
3839
*/
3940
class ReactivePageableHandlerMethodArgumentResolverUnitTests {
4041

@@ -150,6 +151,17 @@ void returnsFallbackIfOnlyPageIsGiven() {
150151
assertThat(resolve(resolver, request)).isEqualTo(Pageable.unpaged());
151152
}
152153

154+
@Test
155+
void returnsFallbackIfOnlyPageAndSortIsGiven() {
156+
157+
var resolver = getReactiveResolver();
158+
resolver.setFallbackPageable(Pageable.unpaged());
159+
160+
var request = MockServerHttpRequest.get("foo?page=20&sort=test").build();
161+
162+
assertThat(resolve(resolver, request)).isEqualTo(Pageable.unpaged());
163+
}
164+
153165
@Test // DATACMNS-1211
154166
void returnsFallbackIfFallbackIsUnpagedAndOnlySizeIsGiven() {
155167

0 commit comments

Comments
 (0)