设置JPA Pageable Object的默认页面大小

时间:2014-11-20 05:31:42

标签: spring spring-mvc jpa spring-data-jpa

我有一个PagingandSorting Repository,它有一个接受可分页对象的方法。 我还有一个通过URL接受可分页对象的控制器。

我的用例是,如果用户在URL中指定了页面大小参数,则必须为可分页对象获取该值。如果他没有提到默认值为50.

但是可分页对象现在默认为20.

任何建议都会有所帮助

8 个答案:

答案 0 :(得分:46)

如果您正在讨论Spring Data PagingAndSortingRepository,您可以使用Controller方法上的@PageableDefault设置默认页面大小,如下所示:

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作为第一页。如果您的UI分页库需要1作为第一页,那么您可以将oneIndexedParameters属性设置为true

  

配置是否公开和假设基于1的页码索引   请求参数。默认为false,表示页码为0   在请求中等于第一页。如果设置为true,则为页面   请求中的1号将被视为第一页。

     

参数:oneIndexedParameters - 要设置的oneIndexedParameters

  

将Pageable配置为在没有PageableDefault或的情况下用作后备   PageableDefaults(后者仅在传统模式下支持)可以   找到要解析的方法参数。如果将此值设置为null,   请注意,您的控制器方法将被归入其中   case no可在请求中找到可分页数据。注意,这样做   将要求您提供机器人页面和尺寸参数与   请求,因为任何参数都没有默认值   可用。

     

参数: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);
    }
}

答案 1 :(得分:14)

您可以在application.yml

中进行设置
spring.data.rest.default-page-size: 50

答案 2 :(得分:14)

对于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 :(得分:8)

并且,为了完整性,这里是Spring Boot配置的示例。在扩展WebMvcConfigurerAdapter的@Configuration类中,将默认页面大小设置为50个项目,如下所示:

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

答案 4 :(得分:4)

您可以在Pageable参数之前使用此注释:

@PageableDefault(size = 40)

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

答案 5 :(得分:1)

这仍然没有很好的文档记录,但对于其他人发现这篇文章,RepositoryRestConfigurerAdapter在那里有所有spring数据rest配置。

@Configuration
public static class RestConfig extends RepositoryRestConfigurerAdapter {

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

}

答案 6 :(得分:0)

如果答案非常好,并且在大多数情况下都应该有所帮助。但是,我使用稍微不同的方法,这允许我为每个模型使用不同的默认页面大小,并且可以使用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));
}

我为不同的模型/控制器使用不同的默认页面大小变量,然后甚至可以从系统属性进行配置。

答案 7 :(得分:0)

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