Spring PageableArgumentResolver 已经被弃用,如何使用 PageableHandlerMethodArgumentResolver?

13

这是我的当前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,我认为我们可以像这样注册它而无需适配器:

PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
resolver.setFallbackPageable(new PageRequest(0, 10));
return new HandlerMethodArgumentResolver[]{resolver};

@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)指的是第二页,所以我必须使用new PageRequest(0, 5)来显示第一页。

但我仍然遇到了这个新对象的问题。当我在不带参数的情况下调用URL(page.page和page.size都没有)时,分页栏的第一次加载非常完美。然而,当我想要移动分页栏时,我们使用两个参数调用相同的URL(例如,page.page=3&page.size=5),仍然显示第一页。我认为这个新的解析器需要更多的参数,以便它不激活回退条件。您有任何关于如何使用PageableHandlerMethodArgumentResolver的想法吗?

3个回答

4
你可以使用以下方法更改参数名称: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);
}

这样做,你就不会影响到前端。 - user3799232

4

我刚在这个类的实现中找到了答案。我们现在需要对这个新类进行两个更改:

  1. 参数不再具有前缀“page”。"..?page=2&size=5" 就可以使用。
  2. 由于页面1现在指的是第2页,因此我们需要重新定义分页.jsp中的参数:..?page=${item.number-1} 而不是 ..?page=${item.number}

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>

这将覆盖默认的参数名称。


这似乎不起作用。查看argument-resolvers的文档,它说:“使用此选项不会覆盖解析处理程序方法参数的内置支持。要自定义内置的参数解析支持,请直接配置RequestMappingHandlerAdapter。” - jplandrain
请查看http://stackoverflow.com/questions/23521280/spring-data-rest-configure-pagination。 - jplandrain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接