Подтвердить что ты не робот

Spring PageableArgumentResolver устарел, как использовать PageableHandlerMethodArgumentResolver?

Это мой текущий файл 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). Затем, когда я хочу перейти на панель разбиения на страницы, мы вызываем тот же URL с двумя параметрами (например, page.page = 3 & page.size = 5), на первой странице все еще отображается. Я думаю, что для этого нового Resolver требуется больше, чем только эти 2 параметра, так что он не активирует резервное условие. Вы знаете, как работать с этим PageableHandlerMethodArgumentResolver?

4b9b3361

Ответ 1

Я только что нашел ответ в реализации этого класса. Теперь нам нужны 2 изменения для этого нового класса:

  • Параметры больше не имеют префикса "страница". "..?page=2&size=5" работает.
  • Поскольку страница 1 относится к странице 2. теперь мы должны переопределить наши параметры в pagination.jsp: ..?page=${item.number-1} вместо ..?page=${item.number}

Ответ 2

Вы можете изменить имена параметров, используя следующие методы: setPageParameterName, setSizeParameterName.

Установите для этого параметра setOneIndexedParameters значение true, если ваша первая страница равна 1.

@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);
}

Ответ 3

Вы можете изменить имена параметров в определении 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>

Это переопределит имена параметров по умолчанию.