@Override public boolean supportsParameter(MethodParameter parameter) { return delegate.supportsParameter(parameter); }
public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) { if (methodParameter.getParameterType().equals(Pageable.class)) { assertPageableUniqueness(methodParameter); Pageable request = getDefaultFromAnnotationOrFallback(methodParameter); ServletRequest servletRequest = (ServletRequest) webRequest.getNativeRequest(); PropertyValues propertyValues = new ServletRequestParameterPropertyValues(servletRequest, getPrefix(methodParameter), separator); DataBinder binder = new ServletRequestDataBinder(request); binder.initDirectFieldAccess(); binder.registerCustomEditor(Sort.class, new SortPropertyEditor("sort.dir", propertyValues)); binder.bind(propertyValues); if (request.getPageNumber() > 0) { request = new PageRequest(request.getPageNumber() - 1, request.getPageSize(), request.getSort()); } return request; } return UNRESOLVED; }
/** * Asserts uniqueness of all {@link Pageable} parameters of the method of the given {@link MethodParameter}. * * @param parameter */ private void assertPageableUniqueness(MethodParameter parameter) { Method method = parameter.getMethod(); if (containsMoreThanOnePageableParameter(method)) { Annotation[][] annotations = method.getParameterAnnotations(); assertQualifiersFor(method.getParameterTypes(), annotations); } }
@Override public Pageable resolveArgument(MethodParameter methodParameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { Pageable pageable = delegate.resolveArgument(methodParameter, mavContainer, webRequest, binderFactory); if (pageable == null || pageable.getSort() == null) { return pageable; } Sort translated = translator.translateSort(pageable.getSort(), methodParameter, webRequest); return PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), translated); } }
/** * Asserts that every {@link Pageable} parameter of the given parameters carries an {@link Qualifier} annotation to * distinguish them from each other. * * @param parameterTypes * @param annotations */ private void assertQualifiersFor(Class<?>[] parameterTypes, Annotation[][] annotations) { Set<String> values = new HashSet<String>(); for (int i = 0; i < annotations.length; i++) { if (Pageable.class.equals(parameterTypes[i])) { Qualifier qualifier = findAnnotation(annotations[i]); if (null == qualifier) { throw new IllegalStateException( "Ambiguous Pageable arguments in handler method. If you use multiple parameters of type Pageable you need to qualify them with @Qualifier"); } if (values.contains(qualifier.value())) { throw new IllegalStateException("Values of the user Qualifiers must be unique!"); } values.add(qualifier.value()); } } }
private Pageable getDefaultFromAnnotationOrFallback(MethodParameter methodParameter) { // search for PageableDefaults annotation for (Annotation annotation : methodParameter.getParameterAnnotations()) { if (annotation instanceof PageableDefaults) { return getDefaultPageRequestFrom((PageableDefaults) annotation); } } // Construct request with fallback request to ensure sensible // default values. Create fresh copy as Spring will manipulate the // instance under the covers return new PageRequest(fallbackPagable.getPageNumber(), fallbackPagable.getPageSize(), fallbackPagable.getSort()); }
@Override public Pageable resolveArgument(MethodParameter methodParameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { Pageable pageable = delegate.resolveArgument(methodParameter, mavContainer, webRequest, binderFactory); if (pageable == null || pageable.getSort() == null) { return pageable; } Sort translated = translator.translateSort(pageable.getSort(), methodParameter, webRequest); return PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), translated); } }
@Override public boolean supportsParameter(MethodParameter parameter) { return delegate.supportsParameter(parameter); }