问题描述
我想要在控制器中自动构建Spring Pageable对象。所以我定义:
I want Spring auto build Pageable object in controller . So I define :
@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的分页。运行页面时。我看到了日志:
I override page size to 10 (default is 20) , and set to 1-based paging. When running the page . I see the log :
Controller - pageable = Page request [number: 0, size 10, sort: null]
如果我添加参数'?page = 1& size = 1
'到URL,它仍然打印:
If I add parameter '?page=1&size=1
' to the URL , it still prints :
Controller - pageable = Page request [number: 0, size 10, sort: null]
如果我将参数更改为?sort = id
,它记录:
If I change parameter to ?sort=id
, it logs :
Controller - pageable = Page request [number: 0, size 10, sort: id: ASC]
似乎我的默认大小(10)正常工作,排序
参数正确传递给Pageable。但是为什么参数页面和大小在这里不起作用?
It seems my default size (10) is working , and sort
parameter is correctly passed to Pageable . But why parameter page and size not working here ?
在 PageableHandlerMethodArgumentResolver
源代码中,它指定
private static final String DEFAULT_PAGE_PARAMETER = "page";
private static final String DEFAULT_SIZE_PARAMETER = "size";
但我不知道为什么它仍然不起作用。我错过了什么吗?
But I don't know why it still not works. Did I miss anything ?
环境:
spring-boot 1.3.1.RELEASE
spring-webmvc 4.2.3.RELEASE
===== ====更新=========
========= Updated =========
谢谢@TimeTravel的回答。
Thanks @TimeTravel's answer.
似乎没有办法定义 1
& size
在这里确实是10(不减1 = 9) Pageable
对象。
It seems there's no way to define an 1-based
& size
is truly 10 (not minus one = 9) Pageable
object here .
正确的解决方案仍在等待......(手动创建除外)
The correct solution is still pending... (except manually creation)
=========再次更新==== =====
========= Updated Again =========
似乎是的错误 - spring-data-jpa:1.9.0.RELEASE
。升级到 spring-data-jpa:1.9.2.RELEASE
后,它现在可以正常工作。
It seems it is the bug of spring-data-jpa:1.9.0.RELEASE
. After upgrading to spring-data-jpa:1.9.2.RELEASE
, it works now.
参见了解详情。
推荐答案
您必须使用argumentResolvers作为参数调用超类addArgumentResolvers方法。
You have to call the super class addArgumentResolvers method with your argumentResolvers as the argument.
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);
}
因为你设置了,您的页面数字
将从0开始。因此,如果您设置 page = 1
在URL中,可分页对象将具有 number = 0
。如果将其设置为false或删除该语句,则URL中的 size = 1
将具有 number = 1
in pageable
object。
Since you did set resolver.setOneIndexedParameters(true);
, your page number
will start with 0. So if you set the page=1
in the URL, the pageable object will have number=0
. If you set it to false or remove that statement, then the size=1
in URL will have number=1
in pageable
object.
来自文档 -
With上述两项更改 -
With the above two changes in place -
page = 1& sort = id& size = 1
将返回 [number:1,size 1,sort:id:ASC]
这篇关于Spring4 MVC Controller Pageable无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!