Spring4 MVC Controller Pageable无法正常工作

时间:2015-12-25 02:58:19

标签: java spring spring-mvc

我想要在控制器中自动构建Spring Pageable对象。所以我定义:

@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]

如果我在URL中添加参数“?page=1&size=1”,它仍会打印:

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。但为什么参数页面和大小不能在这里工作?

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

=========更新=========

谢谢@TimeTravel的回答。

似乎没有办法定义1-based&amp; size在这里确实是10个(不是一个= 9)Pageable个对象。

正确的解决方案仍在等待......(手动创建除外)

=========再次更新=========

似乎是spring-data-jpa:1.9.0.RELEASE的错误。升级到spring-data-jpa:1.9.2.RELEASE后,它现在可以使用了。

有关详细信息,请参阅DATACMNS-761

1 个答案:

答案 0 :(得分:10)

您必须使用argumentResolvers作为参数调用超类addArgumentResolvers方法。

 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);
  }

由于您设置了resolver.setOneIndexedParameters(true);,因此您的网页number将从0开始。因此,如果您在网址中设置了page=1,则可分页对象将具有number=0。如果您将其设置为false或删除该语句,则网址中的size=1将在number=1对象中包含pageable

从文档中 - protected boolean isOneIndexedParameters()

  

指示是否公开和假设基于1的页码索引   请求参数。默认为false,表示页码为0   在请求中等于第一页。如果设置为true,则为页面   请求中的1号将被视为第一页。

上述两项变更 -

page=1&sort=id&size=1将返回[number: 1, size 1, sort: id: ASC]