|
15 | 15 | */
|
16 | 16 | package org.springframework.data.web;
|
17 | 17 |
|
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; |
24 | 18 | import org.springframework.core.MethodParameter;
|
25 | 19 | import org.springframework.data.domain.PageRequest;
|
26 | 20 | import org.springframework.data.domain.Pageable;
|
27 | 21 | import org.springframework.data.domain.Sort;
|
28 | 22 | import org.springframework.lang.Nullable;
|
29 |
| -import org.springframework.util.Assert; |
30 |
| -import org.springframework.util.StringUtils; |
31 | 23 | import org.springframework.web.bind.support.WebDataBinderFactory;
|
32 | 24 | import org.springframework.web.context.request.NativeWebRequest;
|
33 | 25 | import org.springframework.web.method.support.ModelAndViewContainer;
|
|
43 | 35 | * @author Mark Paluch
|
44 | 36 | * @author Christoph Strobl
|
45 | 37 | */
|
46 |
| -public class PageableHandlerMethodArgumentResolver implements PageableArgumentResolver { |
| 38 | +public class PageableHandlerMethodArgumentResolver extends PageableHandlerMethodArgumentResolverSupport |
| 39 | + implements PageableArgumentResolver { |
47 | 40 |
|
48 | 41 | 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; |
59 | 42 | 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; |
66 | 43 |
|
67 | 44 | /**
|
68 | 45 | * Constructs an instance of this resolved with a default {@link SortHandlerMethodArgumentResolver}.
|
@@ -239,106 +216,17 @@ public boolean supportsParameter(MethodParameter parameter) {
|
239 | 216 | public Pageable resolveArgument(MethodParameter methodParameter, @Nullable ModelAndViewContainer mavContainer,
|
240 | 217 | NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) {
|
241 | 218 |
|
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)); |
248 | 221 |
|
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; |
265 | 222 |
|
266 | 223 | Sort sort = sortResolver.resolveArgument(methodParameter, mavContainer, webRequest, binderFactory);
|
| 224 | + Pageable pageable = getPageable(methodParameter, page, pageSize); |
267 | 225 |
|
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); |
317 | 228 | }
|
318 | 229 |
|
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; |
343 | 231 | }
|
344 | 232 | }
|
0 commit comments