当前位置:  开发笔记 > 编程语言 > 正文

Spring4 MVC Controller Pageable无法正常工作

如何解决《Spring4MVCControllerPageable无法正常工作》经验,为你挑选了1个好方法。

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

@RequestMapping("/list")
public String list(Model model , Pageable pageable) {
  logger.info("pageable = {}" , pageable);
  // ... skipped
}

我定义PageableHandlerMethodArgumentResolverWebMvcConfigurerAdapter:

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

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

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(不是减去1 = 9)Pageable对象.

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

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

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

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



1> Omkar..:

您必须使用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);,因此您的页面number将从0开始.因此,如果您page=1在URL中设置,则可分页对象将具有number=0.如果你把它设置为false或删除语句,那么size=1在URL会number=1pageable对象.

来自文档 - 受保护的boolean isOneIndexedParameters()

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

随着上述两个变化到位 -

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

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有