不推荐使用Spring PageableArgumentResolver,如何使用PageableHandlerMethodArgumentResolver?

时间:2013-11-03 19:03:13

标签: java spring spring-mvc spring-data

这是我当前的PageableResolver:

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
    PageableArgumentResolver resolver = new PageableArgumentResolver();
    resolver.setFallbackPageable(new PageRequest(1, 5));
    argumentResolvers.add(new ServletWebArgumentResolverAdapter(resolver));
}

但是不推荐使用PageableArgumentResolver,并链接到PageableHandlerMethodArgumentResolver,我想我们可以在没有适配器的情况下注册,如下所示:

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
    PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
    resolver.setFallbackPageable(new PageRequest(0, 5));
    argumentResolvers.add(resolver);
}

首先,新类PageableHandlerMethodArgumentResolver的实现略有不同,因为new PageRequest(1, 5)指向2.页面,所以我必须使用new PageRequest(0, 5)才能显示第一页。

但我仍然遇到这个新对象的问题。当我调用没有参数的URL(page.page和page.size)时,首次加载分页栏是完美的。然后,当我想在分页栏上移动时,我们使用2个参数调用相同的URL(例如,page.page = 3&amp; page.size = 5),仍然显示第一页。我认为这个新的解析器需要的不仅仅是这两个参数,因此它不会激活回退条件。您是否知道如何使用此PageableHandlerMethodArgumentResolver?

3 个答案:

答案 0 :(得分:4)

我刚刚在本课程的实施中找到了答案。我们现在需要对这个新类进行2次更改:

  1. 参数不再具有前缀“page”。 “..?page=2&size=5”有效。
  2. 由于页面1现在引用了2.页面,我们必须在pagination.jsp中重新定义我们的参数:..?page=${item.number-1}而不是..?page=${item.number}

答案 1 :(得分:3)

您可以使用以下方法更改参数名称:setPageParameterName,setSizeParameterName。

如果您的初始页面为1,请将此setOneIndexedParameters设置为true。

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
    PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
    resolver.setPageParameterName("page.page");
    resolver.setSizeParameterName("page.size");
    resolver.setOneIndexedParameters(true);
    argumentResolvers.add(resolver);
    super.addArgumentResolvers(argumentResolvers);
}

答案 2 :(得分:2)

您可以更改bean定义中的参数名称:

    <annotation-driven>
    <argument-resolvers>
        <beans:bean class="org.springframework.data.web.PageableHandlerMethodArgumentResolver">
            <beans:property name="maxPageSize" value="7"></beans:property>
            <beans:property name="oneIndexedParameters" value="true"></beans:property>
            <beans:property name="pageParameterName" value="page.page"></beans:property>
            <beans:property name="sizeParameterName" value="page.size"></beans:property>
        </beans:bean>
    </argument-resolvers>
</annotation-driven>

这将覆盖默认参数名称。