我想要在控制器中自动构建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。
答案 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]