【问题标题】:Spring PageableArgumentResolver deprecated, how to use PageableHandlerMethodArgumentResolver?Spring PageableArgumentResolver 已弃用,如何使用 PageableHandlerMethodArgumentResolver?
【发布时间】:2013-11-14 10:13:36
【问题描述】:

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

但我仍然对这个新对象有疑问。当我调用不带参数的 URL(既不是 page.page 也不是 page.size)时,分页栏的第一次加载是完美的。然后当我想在分页栏上移动时,我们用 2 个参数(例如 page.page=3&page.size=5)调用相同的 url,仍然显示第一页。我认为这个新的解析器需要的不仅仅是这两个参数,这样它就不会激活回退条件。你知道如何使用这个 PageableHandlerMethodArgumentResolver 吗?

【问题讨论】:

    标签: java spring spring-mvc spring-data


    【解决方案1】:

    您可以使用以下方法更改参数名称: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】:

    您可以更改 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>
    

    这将覆盖默认参数名称。

    【讨论】:

    • 这似乎不起作用。查看参数解析器的文档,它说:“使用此选项不会覆盖对解析处理程序方法参数的内置支持。要自定义对参数解析的内置支持,请直接配置 RequestMappingHandlerAdapter。”
    【解决方案3】:

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

    1. 参数不再有前缀“page”。 “..?page=2&amp;size=5”有效。
    2. 既然第1页现在指的是第2页,我们必须在pagination.jsp中重新定义我们的参数:..?page=${item.number-1}而不是..?page=${item.number}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-31
      • 2016-02-09
      • 2016-07-13
      • 2018-09-25
      • 2022-11-27
      • 1970-01-01
      • 2014-02-12
      • 1970-01-01
      相关资源
      最近更新 更多