public KeysetPageableHandlerMethodArgumentResolver(SortHandlerMethodArgumentResolver sortResolver, ConversionService conversionService) { super(sortResolver = sortResolver == null ? new SortHandlerMethodArgumentResolver() : sortResolver); this.sortResolver = sortResolver; this.conversionService = conversionService; }
@Override public Sort resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) { String[] directionParameter = webRequest.getParameterValues(getSortParameter(parameter)); // No parameter if (directionParameter == null) { return getDefaultFromAnnotationOrFallback(parameter); } // Single empty parameter, e.g "sort=" if (directionParameter.length == 1 && !StringUtils.hasText(directionParameter[0])) { return getDefaultFromAnnotationOrFallback(parameter); } return parseParameterIntoSort(directionParameter, propertyDelimiter); }
Sort sort = sortResolver.resolveArgument(methodParameter, mavContainer, webRequest, binderFactory);
/** * Parses the given sort expressions into a {@link Sort} instance. The implementation expects the sources to be a * concatenation of Strings using the given delimiter. If the last element can be parsed into a {@link Direction} it's * considered a {@link Direction} and a simple property otherwise. * * @param source will never be {@literal null}. * @param delimiter the delimiter to be used to split up the source elements, will never be {@literal null}. * @return */ Sort parseParameterIntoSort(String[] source, String delimiter) { List<Order> allOrders = new ArrayList<>(); for (String part : source) { if (part == null) { continue; } String[] elements = part.split(delimiter); Optional<Direction> direction = elements.length == 0 ? Optional.empty() : Direction.fromOptionalString(elements[elements.length - 1]); int lastIndex = direction.map(it -> elements.length - 1).orElseGet(() -> elements.length); for (int i = 0; i < lastIndex; i++) { toOrder(elements[i], direction).ifPresent(allOrders::add); } } return allOrders.isEmpty() ? Sort.unsorted() : Sort.by(allOrders); }
/** * Reads the default {@link Sort} to be used from the given {@link MethodParameter}. Rejects the parameter if both an * {@link SortDefaults} and {@link SortDefault} annotation is found as we cannot build a reliable {@link Sort} * instance then (property ordering). * * @param parameter will never be {@literal null}. * @return the default {@link Sort} instance derived from the parameter annotations or the configured fallback-sort * {@link #setFallbackSort(Sort)}. */ private Sort getDefaultFromAnnotationOrFallback(MethodParameter parameter) { SortDefaults annotatedDefaults = parameter.getParameterAnnotation(SortDefaults.class); SortDefault annotatedDefault = parameter.getParameterAnnotation(SortDefault.class); if (annotatedDefault != null && annotatedDefaults != null) { throw new IllegalArgumentException( String.format("Cannot use both @%s and @%s on parameter %s! Move %s into %s to define sorting order!", SORT_DEFAULTS_NAME, SORT_DEFAULT_NAME, parameter.toString(), SORT_DEFAULT_NAME, SORT_DEFAULTS_NAME)); } if (annotatedDefault != null) { return appendOrCreateSortTo(annotatedDefault, Sort.unsorted()); } if (annotatedDefaults != null) { Sort sort = Sort.unsorted(); for (SortDefault currentAnnotatedDefault : annotatedDefaults.value()) { sort = appendOrCreateSortTo(currentAnnotatedDefault, sort); } return sort; } return fallbackSort; }
@PostConstruct public void configureResolvers() { // correct behaviour is: fallback page number must be 0 at all pageableResolver.setFallbackPageable(new PageRequest(0, pagingProperties.getMaxPageSize())); pageableResolver.setOneIndexedParameters(pagingProperties.getOneBased()); pageableResolver.setMaxPageSize(pagingProperties.getMaxPageSize()); pageableResolver.setPageParameterName(pagingProperties.getPageParamName()); pageableResolver.setSizeParameterName(pagingProperties.getSizeParamName()); sortResolver.setSortParameter(pagingProperties.getSortParamName()); } }
Sort sort = sortResolver.resolveArgument(methodParameter, mavContainer, webRequest, binderFactory);
public KeysetPageableHandlerMethodArgumentResolver(SortHandlerMethodArgumentResolver sortResolver, ConversionService conversionService) { super(sortResolver = sortResolver == null ? new SortHandlerMethodArgumentResolver() : sortResolver); this.sortResolver = sortResolver; this.conversionService = conversionService; }
@Bean public SortHandlerMethodArgumentResolver sortResolver() { return new SortHandlerMethodArgumentResolver(); }
@Bean public SortHandlerMethodArgumentResolver sortResolver() { return new SortHandlerMethodArgumentResolver(); }
@Bean public SortHandlerMethodArgumentResolver sortResolver() { return new SortHandlerMethodArgumentResolver(); }
@Bean public SortHandlerMethodArgumentResolver sortResolver() { SortHandlerMethodArgumentResolver sortResolver = new SortHandlerMethodArgumentResolver(); customizeSortResolver(sortResolver); return sortResolver; }