Skip to content

Commit 48daa4c

Browse files
committed
DATACMNS-1211 - Add ReactiveSortHandlerMethodArgumentResolver.
Add ReactiveSortHandlerMethodArgumentResolver and extract shared code from imperative SortHandlerMethodArgumentResolver into SortHandlerMethodArgumentResolverSupport. Original pull request: #264.
1 parent d1d5fa0 commit 48daa4c

11 files changed

+1377
-379
lines changed

pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@
6363
<artifactId>spring-web</artifactId>
6464
<optional>true</optional>
6565
</dependency>
66+
<dependency>
67+
<groupId>org.springframework</groupId>
68+
<artifactId>spring-webflux</artifactId>
69+
<optional>true</optional>
70+
</dependency>
6671

6772
<dependency>
6873
<groupId>javax.servlet</groupId>

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

Lines changed: 8 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,11 @@
1515
*/
1616
package org.springframework.data.web;
1717

18-
import static org.springframework.data.web.SpringDataAnnotationUtils.*;
19-
20-
import java.lang.reflect.Method;
21-
import java.util.Optional;
22-
23-
import org.springframework.beans.factory.annotation.Qualifier;
2418
import org.springframework.core.MethodParameter;
2519
import org.springframework.data.domain.PageRequest;
2620
import org.springframework.data.domain.Pageable;
2721
import org.springframework.data.domain.Sort;
2822
import org.springframework.lang.Nullable;
29-
import org.springframework.util.Assert;
30-
import org.springframework.util.StringUtils;
3123
import org.springframework.web.bind.support.WebDataBinderFactory;
3224
import org.springframework.web.context.request.NativeWebRequest;
3325
import org.springframework.web.method.support.ModelAndViewContainer;
@@ -43,26 +35,11 @@
4335
* @author Mark Paluch
4436
* @author Christoph Strobl
4537
*/
46-
public class PageableHandlerMethodArgumentResolver implements PageableArgumentResolver {
38+
public class PageableHandlerMethodArgumentResolver extends PageableHandlerMethodArgumentResolverSupport
39+
implements PageableArgumentResolver {
4740

4841
private static final SortHandlerMethodArgumentResolver DEFAULT_SORT_RESOLVER = new SortHandlerMethodArgumentResolver();
49-
private static final String INVALID_DEFAULT_PAGE_SIZE = "Invalid default page size configured for method %s! Must not be less than one!";
50-
51-
private static final String DEFAULT_PAGE_PARAMETER = "page";
52-
private static final String DEFAULT_SIZE_PARAMETER = "size";
53-
private static final String DEFAULT_PREFIX = "";
54-
private static final String DEFAULT_QUALIFIER_DELIMITER = "_";
55-
private static final int DEFAULT_MAX_PAGE_SIZE = 2000;
56-
static final Pageable DEFAULT_PAGE_REQUEST = PageRequest.of(0, 20);
57-
58-
private Pageable fallbackPageable = DEFAULT_PAGE_REQUEST;
5942
private SortArgumentResolver sortResolver;
60-
private String pageParameterName = DEFAULT_PAGE_PARAMETER;
61-
private String sizeParameterName = DEFAULT_SIZE_PARAMETER;
62-
private String prefix = DEFAULT_PREFIX;
63-
private String qualifierDelimiter = DEFAULT_QUALIFIER_DELIMITER;
64-
private int maxPageSize = DEFAULT_MAX_PAGE_SIZE;
65-
private boolean oneIndexedParameters = false;
6643

6744
/**
6845
* Constructs an instance of this resolved with a default {@link SortHandlerMethodArgumentResolver}.
@@ -239,106 +216,17 @@ public boolean supportsParameter(MethodParameter parameter) {
239216
public Pageable resolveArgument(MethodParameter methodParameter, @Nullable ModelAndViewContainer mavContainer,
240217
NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) {
241218

242-
assertPageableUniqueness(methodParameter);
243-
244-
Optional<Pageable> defaultOrFallback = getDefaultFromAnnotationOrFallback(methodParameter).toOptional();
245-
246-
String pageString = webRequest.getParameter(getParameterNameToUse(pageParameterName, methodParameter));
247-
String pageSizeString = webRequest.getParameter(getParameterNameToUse(sizeParameterName, methodParameter));
219+
String page = webRequest.getParameter(getParameterNameToUse(getPageParameterName(), methodParameter));
220+
String pageSize = webRequest.getParameter(getParameterNameToUse(getSizeParameterName(), methodParameter));
248221

249-
Optional<Integer> page = parseAndApplyBoundaries(pageString, Integer.MAX_VALUE, true);
250-
Optional<Integer> pageSize = parseAndApplyBoundaries(pageSizeString, maxPageSize, false);
251-
252-
if (!(page.isPresent() && pageSize.isPresent()) && !defaultOrFallback.isPresent()) {
253-
return Pageable.unpaged();
254-
}
255-
256-
int p = page
257-
.orElseGet(() -> defaultOrFallback.map(Pageable::getPageNumber).orElseThrow(IllegalStateException::new));
258-
int ps = pageSize
259-
.orElseGet(() -> defaultOrFallback.map(Pageable::getPageSize).orElseThrow(IllegalStateException::new));
260-
261-
// Limit lower bound
262-
ps = ps < 1 ? defaultOrFallback.map(Pageable::getPageSize).orElseThrow(IllegalStateException::new) : ps;
263-
// Limit upper bound
264-
ps = ps > maxPageSize ? maxPageSize : ps;
265222

266223
Sort sort = sortResolver.resolveArgument(methodParameter, mavContainer, webRequest, binderFactory);
224+
Pageable pageable = getPageable(methodParameter, page, pageSize);
267225

268-
return PageRequest.of(p, ps,
269-
sort.isSorted() ? sort : defaultOrFallback.map(Pageable::getSort).orElseGet(Sort::unsorted));
270-
}
271-
272-
/**
273-
* Returns the name of the request parameter to find the {@link Pageable} information in. Inspects the given
274-
* {@link MethodParameter} for {@link Qualifier} present and prefixes the given source parameter name with it.
275-
*
276-
* @param source the basic parameter name.
277-
* @param parameter the {@link MethodParameter} potentially qualified.
278-
* @return the name of the request parameter.
279-
*/
280-
protected String getParameterNameToUse(String source, @Nullable MethodParameter parameter) {
281-
282-
StringBuilder builder = new StringBuilder(prefix);
283-
284-
Qualifier qualifier = parameter == null ? null : parameter.getParameterAnnotation(Qualifier.class);
285-
286-
if (qualifier != null) {
287-
builder.append(qualifier.value());
288-
builder.append(qualifierDelimiter);
289-
}
290-
291-
return builder.append(source).toString();
292-
}
293-
294-
private Pageable getDefaultFromAnnotationOrFallback(MethodParameter methodParameter) {
295-
296-
PageableDefault defaults = methodParameter.getParameterAnnotation(PageableDefault.class);
297-
298-
if (defaults != null) {
299-
return getDefaultPageRequestFrom(methodParameter, defaults);
300-
}
301-
302-
return fallbackPageable;
303-
}
304-
305-
private static Pageable getDefaultPageRequestFrom(MethodParameter parameter, PageableDefault defaults) {
306-
307-
Integer defaultPageNumber = defaults.page();
308-
Integer defaultPageSize = getSpecificPropertyOrDefaultFromValue(defaults, "size");
309-
310-
if (defaultPageSize < 1) {
311-
Method annotatedMethod = parameter.getMethod();
312-
throw new IllegalStateException(String.format(INVALID_DEFAULT_PAGE_SIZE, annotatedMethod));
313-
}
314-
315-
if (defaults.sort().length == 0) {
316-
return PageRequest.of(defaultPageNumber, defaultPageSize);
226+
if (sort.isSorted()) {
227+
return PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), sort);
317228
}
318229

319-
return PageRequest.of(defaultPageNumber, defaultPageSize, defaults.direction(), defaults.sort());
320-
}
321-
322-
/**
323-
* Tries to parse the given {@link String} into an integer and applies the given boundaries. Will return 0 if the
324-
* {@link String} cannot be parsed.
325-
*
326-
* @param parameter the parameter value.
327-
* @param upper the upper bound to be applied.
328-
* @param shiftIndex whether to shift the index if {@link #oneIndexedParameters} is set to true.
329-
* @return
330-
*/
331-
private Optional<Integer> parseAndApplyBoundaries(@Nullable String parameter, int upper, boolean shiftIndex) {
332-
333-
if (!StringUtils.hasText(parameter)) {
334-
return Optional.empty();
335-
}
336-
337-
try {
338-
int parsed = Integer.parseInt(parameter) - (oneIndexedParameters && shiftIndex ? 1 : 0);
339-
return Optional.of(parsed < 0 ? 0 : parsed > upper ? upper : parsed);
340-
} catch (NumberFormatException e) {
341-
return Optional.of(0);
342-
}
230+
return pageable;
343231
}
344232
}

0 commit comments

Comments
 (0)