Задайте размер страницы по умолчанию для JPA-страницы

У меня есть PagingandSorting Repository, у которого есть метод, который использует объект, который можно просмотреть. У меня также есть контроллер, который принимает URL-адрес для страницы.

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

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

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

Ответ 1

Если вы говорите о 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, что означает, что номер страницы в запросе равен первой странице. Если для этого параметра установлено значение true, номер страницы 1 в запросе будет считаться первой страницей.

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

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

Параметры: 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);
    }
}

Ответ 2

Для 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.

Ответ 3

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

spring.data.rest.default-page-size: 50

Ответ 4

И, для полноты, вот пример конфигурации 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);
}

Ответ 5

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

@PageableDefault(size = 40)

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

Ответ 6

Это все еще плохо документировано, но для тех, кто еще находит эту статью, у RepositoryRestConfigurerAdapter есть все spring там, где есть резервная копия данных.

@Configuration
public static class RestConfig extends RepositoryRestConfigurerAdapter {

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

}

Ответ 7

Предоставленные ответы очень хороши и должны помочь в большинстве случаев. Тем не менее, я использую несколько иной подход, который позволяет мне использовать разные размеры страницы по умолчанию для каждой модели и может быть настроен с помощью 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));
}

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

Ответ 8

В Spring Boot 2.1.6.RELEASE вы можете использовать ниже:

@Configuration
public class WebConfig implements WebMvcConfigurer{

    @Value("${paging.default.pageSize}")
    private int size;

    @Value("${paging.default.page}")
    private int page;


    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
        resolver.setFallbackPageable(PageRequest.of(page, size));
        resolvers.add(resolver);
        WebMvcConfigurer.super.addArgumentResolvers(resolvers);
    }
}