Spring4 MVC Controller Pageable无法正常工作 [英] Spring4 MVC Controller Pageable not working

查看:137
本文介绍了Spring4 MVC Controller Pageable无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

参见 DATACMNS-761 了解详情。

推荐答案

您必须使用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);
  }

因为你设置了 resolver.setOneIndexedParameters(true ); ,您的页面数字将从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.

来自文档 -
protected boolean isOneIndexedParameters()


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

Indicates whether to expose and assume 1-based page number indexes in the request parameters. Defaults to false, meaning a page number of 0 in the request equals the first page. If this is set to true, a page number of 1 in the request will be considered the first page.

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无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆