Spring4 MVC контроллер Pageable не работает
я хочу Spring auto build Pageable object в контроллере . Так я определяю:
@RequestMapping("/list")
public String list(Model model , Pageable pageable) {
logger.info("pageable = {}" , pageable);
// ... skipped
}
и я определяю PageableHandlerMethodArgumentResolver
на WebMvcConfigurerAdapter
:
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
resolver.setMaxPageSize(10);
resolver.setOneIndexedParameters(true);
argumentResolvers.add(resolver);
}
}
я переопределяю размер страницы до 10 (по умолчанию 20) и устанавливаю подкачку на основе 1. При запуске страницы . Я вижу журнал:
Controller - pageable = Page request [number: 0, size 10, sort: null]
если я добавлю параметр'?page=1&size=1
' к URL, он все еще печатает:
Controller - pageable = Page request [number: 0, size 10, sort: null]
если я изменю параметр на ?sort=id
запись :
Controller - pageable = Page request [number: 0, size 10, sort: id: ASC]
кажется мой размер по умолчанию (10) работает , а sort
параметр правильно передается в Pageable . Но почему параметр page и size здесь не работает ?
на PageableHandlerMethodArgumentResolver
исходный код , он назначает
private static final String DEFAULT_PAGE_PARAMETER = "page";
private static final String DEFAULT_SIZE_PARAMETER = "size";
но я не знаю, почему он все еще не работает. Я что-нибудь пропустил ?
окружение:
spring-boot 1.3.1.RELEASE
spring-webmvc 4.2.3.RELEASE
========= Обновлено =========
спасибо ответ @путешествие по.
кажется, что нет способа определить 1-based
& size
действительно 10 (не минус один = 9) Pageable
объект здесь .
правильное решение еще не принято... (кроме ручного создания)
========= Обновлено Снова =========
кажется, это ошибка spring-data-jpa:1.9.0.RELEASE
. После обновления до spring-data-jpa:1.9.2.RELEASE
, она работает сейчас.
посмотреть DATACMNS-761 для детали.
1 ответов
вы должны вызвать метод super class addArgumentResolvers с вашими argumentResolvers в качестве аргумента.
super.addArgumentResolvers(argumentResolvers);
проверьте код ниже.
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
resolver.setMaxPageSize(10);
resolver.setOneIndexedParameters(true);
argumentResolvers.add(resolver);
super.addArgumentResolvers(argumentResolvers);
}
так как вы сделали set resolver.setOneIndexedParameters(true);
страница number
начнется с 0. Поэтому, если вы установите page=1
в URL-адресе объект подкачки будет иметь number=0
. Если вы установите значение false или удалите это утверждение, то size=1
в URL будет иметь number=1
на pageable
объект.
из документации - защищенные логические isOneIndexedParameters ()
указывает, следует ли выставлять и предполагать индексы номеров страниц на основе 1 в параметр запроса. По умолчанию false, что означает номер страницы 0 в запросе равна первой странице. Если установлено значение true, страница номер 1 в запросе будет считаться первой страницей.
с вышеуказанными двумя изменениями на месте -
page=1&sort=id&size=1
вернутся [number: 1, size 1, sort: id: ASC]