繁体   English   中英

Spring4 MVC Controller Pageable无法正常工作

[英]Spring4 MVC Controller Pageable not working

我想在控制器中使用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<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-basedsize是真正的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<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的URL时,可分页对象将拥有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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM