Skip to content

Commit 5155112

Browse files
quaffapp
authored and
app
committed
Use Pageable.unpaged(sort) for sorted unpaged pageable.
The (Reactive)PageableHandlerMethodArgumentResolver now falls back to a unpaged Pageable instance with a resolved sort if the the resolved Pageable is unpaged. Fixes: spring-projectsGH-3094 Original pull request: spring-projectsGH-2865
1 parent 01f6bca commit 5155112

File tree

4 files changed

+73
-5
lines changed

4 files changed

+73
-5
lines changed

Diff for: src/main/java/org/springframework/data/web/PageableHandlerMethodArgumentResolver.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
* @author Nick Williams
3434
* @author Mark Paluch
3535
* @author Christoph Strobl
36+
* @author Yanming Zhou
3637
* @since 1.6
3738
*/
3839
public class PageableHandlerMethodArgumentResolver extends PageableHandlerMethodArgumentResolverSupport
@@ -83,7 +84,12 @@ public Pageable resolveArgument(MethodParameter methodParameter, @Nullable Model
8384
Pageable pageable = getPageable(methodParameter, page, pageSize);
8485

8586
if (sort.isSorted()) {
86-
return PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), sort);
87+
if (pageable.isPaged()) {
88+
pageable = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), sort);
89+
}
90+
else {
91+
pageable = Pageable.unpaged(sort);
92+
}
8793
}
8894

8995
return pageable;

Diff for: src/main/java/org/springframework/data/web/ReactivePageableHandlerMethodArgumentResolver.java

+11-2
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 {
@@ -75,9 +76,17 @@ public Pageable resolveArgumentValue(MethodParameter parameter, BindingContext b
7576
String pageSize = queryParams.getFirst(getParameterNameToUse(getSizeParameterName(), parameter));
7677

7778
Sort sort = sortResolver.resolveArgumentValue(parameter, bindingContext, exchange);
78-
7979
Pageable pageable = getPageable(parameter, page, pageSize);
8080

81-
return sort.isSorted() ? PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), sort) : pageable;
81+
if (sort.isSorted()) {
82+
if (pageable.isPaged()) {
83+
pageable = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), sort);
84+
}
85+
else {
86+
pageable = Pageable.unpaged(sort);
87+
}
88+
}
89+
90+
return pageable;
8291
}
8392
}

Diff for: src/test/java/org/springframework/data/web/PageableHandlerMethodArgumentResolverUnitTests.java

+31-2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.springframework.core.MethodParameter;
2525
import org.springframework.data.domain.PageRequest;
2626
import org.springframework.data.domain.Pageable;
27+
import org.springframework.data.domain.Sort;
2728
import org.springframework.data.domain.Sort.Direction;
2829
import org.springframework.data.web.SortDefault.SortDefaults;
2930
import org.springframework.mock.web.MockHttpServletRequest;
@@ -37,6 +38,7 @@
3738
* @author Nick Williams
3839
* @author Vedran Pavic
3940
* @author Mark Paluch
41+
* @author Yanming Zhou
4042
*/
4143
class PageableHandlerMethodArgumentResolverUnitTests extends PageableDefaultUnitTests {
4244

@@ -159,7 +161,7 @@ void returnsUnpagedIfFallbackIsUnpagedAndNoParametersGiven() throws Exception {
159161
}
160162

161163
@Test // DATACMNS-477
162-
void returnsFallbackIfOnlyPageIsGiven() throws Exception {
164+
void returnsFallbackIfOnlyPageIsGiven() {
163165

164166
var resolver = getResolver();
165167
resolver.setFallbackPageable(Pageable.unpaged());
@@ -171,8 +173,35 @@ void returnsFallbackIfOnlyPageIsGiven() throws Exception {
171173
.isEqualTo(Pageable.unpaged());
172174
}
173175

176+
@Test
177+
void returnsSortedUnpagedIfOnlyPageAndSortIsGiven() {
178+
179+
var resolver = getResolver();
180+
resolver.setFallbackPageable(Pageable.unpaged());
181+
182+
var request = new MockHttpServletRequest();
183+
request.addParameter("page", "20");
184+
request.addParameter("sort", "foo");
185+
186+
assertThat(resolver.resolveArgument(supportedMethodParameter, null, new ServletWebRequest(request), null))
187+
.isEqualTo(Pageable.unpaged(Sort.by("foo")));
188+
}
189+
190+
@Test
191+
void returnsSortedUnpagedIfOnlySortIsGiven() {
192+
193+
var resolver = getResolver();
194+
resolver.setFallbackPageable(Pageable.unpaged());
195+
196+
var request = new MockHttpServletRequest();
197+
request.addParameter("sort", "foo");
198+
199+
assertThat(resolver.resolveArgument(supportedMethodParameter, null, new ServletWebRequest(request), null))
200+
.isEqualTo(Pageable.unpaged(Sort.by("foo")));
201+
}
202+
174203
@Test // DATACMNS-477
175-
void returnsFallbackIfFallbackIsUnpagedAndOnlySizeIsGiven() throws Exception {
204+
void returnsFallbackIfFallbackIsUnpagedAndOnlySizeIsGiven() {
176205

177206
var resolver = getResolver();
178207
resolver.setFallbackPageable(Pageable.unpaged());

Diff for: src/test/java/org/springframework/data/web/ReactivePageableHandlerMethodArgumentResolverUnitTests.java

+24
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.springframework.core.MethodParameter;
2626
import org.springframework.data.domain.PageRequest;
2727
import org.springframework.data.domain.Pageable;
28+
import org.springframework.data.domain.Sort;
2829
import org.springframework.data.domain.Sort.Direction;
2930
import org.springframework.data.web.SortDefault.SortDefaults;
3031
import org.springframework.mock.http.server.reactive.MockServerHttpRequest;
@@ -35,6 +36,7 @@
3536
* Unit tests for {@link ReactivePageableHandlerMethodArgumentResolver}.
3637
*
3738
* @author Mark Paluch
39+
* @author Yanming Zhou
3840
*/
3941
class ReactivePageableHandlerMethodArgumentResolverUnitTests {
4042

@@ -150,6 +152,28 @@ void returnsFallbackIfOnlyPageIsGiven() {
150152
assertThat(resolve(resolver, request)).isEqualTo(Pageable.unpaged());
151153
}
152154

155+
@Test
156+
void returnsSortedUnpagedIfOnlyPageAndSortIsGiven() {
157+
158+
var resolver = getReactiveResolver();
159+
resolver.setFallbackPageable(Pageable.unpaged());
160+
161+
var request = MockServerHttpRequest.get("foo?page=20&sort=test").build();
162+
163+
assertThat(resolve(resolver, request)).isEqualTo(Pageable.unpaged(Sort.by("test")));
164+
}
165+
166+
@Test
167+
void returnsSortedUnpagedIfOnlySortIsGiven() {
168+
169+
var resolver = getReactiveResolver();
170+
resolver.setFallbackPageable(Pageable.unpaged());
171+
172+
var request = MockServerHttpRequest.get("foo?sort=test").build();
173+
174+
assertThat(resolve(resolver, request)).isEqualTo(Pageable.unpaged(Sort.by("test")));
175+
}
176+
153177
@Test // DATACMNS-1211
154178
void returnsFallbackIfFallbackIsUnpagedAndOnlySizeIsGiven() {
155179

0 commit comments

Comments
 (0)