it-roy-ru.com

Установить размер страницы по умолчанию для JPA Pageable Object

У меня есть PagingandSorting Repository, в котором есть метод, который принимает объект с возможностью постраничной передачи ... У меня также есть контроллер, который принимает объект с возможностью перелистывания через URL.

Мой пример использования заключается в том, что, если пользователь указывает параметр размера страницы в URL-адресе, я должен принять это значение для объекта, доступного для просмотра. Если он не упоминает, возьмите значение по умолчанию 50. 

Но по умолчанию для объекта со страницей 20 прямо сейчас.

Любые предложения помогут

16
Kousick Shanmugam Nagaraj

Если вы говорите о Spring Data PagingAndSortingRepository, вы можете установить размер страницы по умолчанию с помощью @PageableDefault в методе Controller следующим образом:

public String listClients(@ModelAttribute FilterForm form, Model model, WebRequest request, @PageableDefault(sort = { "surname",
            "forename", "address.town" }, value = 50) Pageable pageable) {

    }

Или вы можете настроить глобальное значение по умолчанию, используя следующую конфигурацию Spring, как показано ниже в конфигурации XML и Java. 

Обратите внимание, что более новые версии Spring Data используют индексацию страниц с нуля, в то время как более старые версии использовали 1 для первой страницы. Если ваша библиотека подкачки пользовательского интерфейса ожидает 1 в качестве первой страницы, тогда вы можете установить для свойства oneIndexedParameters значение true

Настраивает, следует ли предоставлять и принимать индексы номеров страниц на основе 1 в параметры запроса. По умолчанию false, что означает номер страницы 0 в запросе равно первой странице. Если для этого параметра установлено значение true, страница число 1 в запросе будет считаться первой страницей.

Параметры: oneIndexedParameters - устанавливаемые oneIndexedParameters

Настраивает Pageable для использования в качестве запасного варианта в случае отсутствия PageableDefault или PageableDefaults (последний поддерживается только в устаревшем режиме) может быть найдено в параметре метода, который необходимо разрешить. Если для этого параметра установлено значение null, Имейте в виду, что ваши методы-контроллеры получат нулевое значение в case Нет данных для поиска в запросе. Обратите внимание, что при этом Вам потребуется указать бот страницы и параметр размера с помощью запросы, так как не будет никакого значения по умолчанию для любого из параметров имеется в наличии.

Параметры: fallbackPageable - Pageable для общего использования отступать.

В XML это выглядит следующим образом:

<mvc:annotation-driven>
    <mvc:argument-resolvers>
        <bean class="org.springframework.data.web.PageableHandlerMethodArgumentResolver">
            <property name="oneIndexedParameters" value="true"/>
            <property name="fallbackPageable">
                <bean class="org.springframework.data.domain.PageRequest">
                    <constructor-arg name="page" value="1" />
                    <constructor-arg name="size" value="10" />
                </bean>
            </property>
        </bean>
    </mvc:argument-resolvers>
</mvc:annotation-driven>

В Java Config это выглядит следующим образом:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {


    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
        resolver.setOneIndexedParameters(true);
        resolver.setFallbackPageable(new PageRequest(1, 20));
        argumentResolvers.add(resolver);
        super.addArgumentResolvers(argumentResolvers);
    }
}
46
Alan Hay

Вы можете установить ниже в application.yml

spring.data.rest.default-page-size: 50
14
Sathish Kumar Thiyagarajan

Для Spring Boot 2.X у вас есть набор параметров:

# DATA WEB (SpringDataWebProperties)
spring.data.web.pageable.default-page-size=20 # Default page size.
spring.data.web.pageable.max-page-size=2000 # Maximum page size to be accepted.
spring.data.web.pageable.one-indexed-parameters=false # Whether to expose and assume 1-based page number indexes.
spring.data.web.pageable.page-parameter=page # Page index parameter name.
spring.data.web.pageable.prefix= # General prefix to be prepended to the page number and page size parameters.
spring.data.web.pageable.qualifier-delimiter=_ # Delimiter to be used between the qualifier and the actual page number and size properties.
spring.data.web.pageable.size-parameter=size # Page size parameter name.
spring.data.web.sort.sort-parameter=sort # Sort parameter name.
11
Przemek Nowak

И, для полноты, вот пример конфигурации Spring Boot. В классе @Configuration, который расширяет WebMvcConfigurerAdapter, установите размер страницы по умолчанию равным 50 элементам, например:

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

Вы можете использовать эту аннотацию перед параметром Pageable:

@PageableDefault(size = 40)

// so your parameter should be like this:
@PageableDefault(size = 40) Pageable pageable
4
Hadi hashemi

Это все еще не очень хорошо задокументировано, но для любого, кто найдет эту статью, RepositoryRestConfigurerAdapter имеет всю конфигурацию остальных данных пружины там.

@Configuration
public static class RestConfig extends RepositoryRestConfigurerAdapter {

    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
            config.setDefaultPageSize(50);
    }

}
1
jasondt

Приведенные ответы очень хорошие и должны помочь в большинстве случаев. Однако я использую немного другой подход, который позволяет мне использовать различный размер страницы по умолчанию для модели и может быть настроен с помощью Spring или системных свойств. 

Пожалуйста, обратите внимание, что этот подход имеет одно фундаментальное ограничение, а именно: он не принимает любой размер, приходящий с запросом; он использует сортировку информации, хотя. Поэтому, если вам нужна возможность изменять количество возвращаемых элементов на странице с помощью параметров запроса, это решение не для вас.

Прежде всего, я создал служебный класс (или просто метод в контроллере), который создает новую базу данных Pageable на основе запроса Pageable и настроил размер страницы. 

public static Pageable updatePageable(final Pageable source, final int size)
{
    return new PageRequest(source.getPageNumber(), size, source.getSort());
}

В контроллере я добавляю переменную, которая содержит размер моей страницы по умолчанию (в этом случае значение по умолчанию равно 20, если конфигурация не указана): 

@Value("${myapplication.model.items-per-page:20}")
private int itemsPerPage;

И затем я переопределить (т.е. создать новый экземпляр Pageable) по умолчанию в методе обработки запроса:

@RequestMapping(method = RequestMethod.GET)
public Page<Model> websites(final Pageable pageable)
{
    return repository.findAll(updatePageable(pageable, itemsPerPage));
}

Я использую разные переменные размера страницы по умолчанию для разных моделей/контроллеров, которые затем можно настроить даже из системных свойств.

0
Tom