Spring4 MVC Controller Pageable无法正常工作
我想在控制器中使用Spring自动构建Pageable对象。 所以我定义:
@RequestMapping("/list") public String list(Model model , Pageable pageable) { logger.info("pageable = {}" , pageable); // ... skipped }
我在WebMvcConfigurerAdapter
定义了PageableHandlerMethodArgumentResolver
:
@Configuration public class MvcConfig extends WebMvcConfigurerAdapter { @Override public void addArgumentResolvers(List 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
& size
是真正的10(不是减去一个= 9) Pageable
对象。
正确的解决方案仍在等待……(手动创建除外)
=========再次更新=========
它似乎是spring-data-jpa:1.9.0.RELEASE
的错误spring-data-jpa:1.9.0.RELEASE
。 升级到spring-data-jpa:1.9.2.RELEASE
,现在可以使用了。
有关详细信息,请参阅DATACMNS-761 。
您必须使用argumentResolvers作为参数调用超类addArgumentResolvers方法。
super.addArgumentResolvers(argumentResolvers);
检查下面的代码。
@Override public void addArgumentResolvers(List argumentResolvers) { PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver(); resolver.setMaxPageSize(10); resolver.setOneIndexedParameters(true); argumentResolvers.add(resolver); super.addArgumentResolvers(argumentResolvers); }
既然你设置了resolver.setOneIndexedParameters(true);
,您的页码将从0开始。因此,如果您在URL中设置page=1
,则可分页对象的number=0
。 如果将其设置为false或删除该语句,则URL中的size=1
将在pageable
对象中具有number=1
。
来自文档 – 受保护的boolean isOneIndexedParameters()
指示是否在请求参数中公开和假设从1开始的页码索引。 默认为false,表示请求中的页码0等于第一页。 如果设置为true,则请求中的页码1将被视为第一页。
随着上述两个变化到位 –
page=1&sort=id&size=1
将返回[number: 1, size 1, sort: id: ASC]