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]