【问题标题】:Set default page size for JPA Pageable Object为 JPA 可分页对象设置默认页面大小
【发布时间】:2015-01-17 21:23:36
【问题描述】:

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

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

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

任何建议都会有所帮助

【问题讨论】:

  • 我不熟悉 JPA 中的任何 PagingAndSortingRepository。如果这是 Spring Data 问题,请指出是这种情况。

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


【解决方案1】:

对于 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.

【讨论】:

  • 我用的是spring 2.0.2,不能用这个参数。似乎这是一个错误。 github.com/spring-projects/spring-boot/issues/14413
  • @pitchblack408 - 你能解决这个问题吗?
  • @All - 看起来这只适用于 Spring Data REST HATEOAS
  • @pitchblack408 - 在我的情况下它不起作用。能否请您指导一下您在 bController 中除了 Pageable 之外使用了什么?
  • 不适用于 2.2.5.RELEASE @Bean PageableHandlerMethodArgumentResolverCustomizer pageableResolverCustomizer() { return pageableResolver ->{ pageableResolver.setMaxPageSize(500); };这对我有用,但我无法设置默认页面大小
【解决方案2】:

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

@PageableDefault(size = 40)

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

** 更新: 您可以将 40 存储在 application.yml 文件中,并在整个项目中使用。

在 application.yml 中:

pageSize: 40

然后:

// so your parameter should be like this:
@PageableDefault(size = ${pageSize}) Pageable pageable

【讨论】:

  • 如何通过属性文件使这40个可配置?
  • @PAA 你找到解决方案了吗?
  • 您可以将本地变量放在 application.yml 文件中。例如:在 application.yml 文件中,我添加这一行:pageSize: 20。然后我可以在我需要的每个控制器文件中使用它:@Value("${pageSize}") private final int pageSize = 20;
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    如果您谈论的是 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(后者仅在传统模式下支持)可以是 在要解析的方法参数处找到。如果将此设置为空, 请注意,您的控制器方法将在 如果请求中找不到 Pageable 数据。请注意,这样做 将要求您为机器人提供页面和尺寸参数 请求,因为任何参数都没有默认值 可用。

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

    【讨论】:

    • 谢谢,艾伦。但它是全局配置的 name="page" value="0",不是吗?
    • 是的。在某些时候基于 1 到 0 的索引发生了变化,但如果需要,您仍然可以覆盖它以使用前者。有时间我会更新。
    • Java Config 自 Spring 5.x 起已弃用
    • 您关于 Spring Data 的新版本使用基于零的页面索引而旧版本使用 1 作为第一页的声明非常有用。我一直在和这个打架jira.spring.io/browse/DATACMNS-563
    • @All - 请在此处指导:stackoverflow.com/questions/56786158/…
    【解决方案5】:

    这仍然没有很好的记录,但是对于其他找到这篇文章的人来说,RepositoryRestConfigurerAdapter 那里有所有的 spring 数据休息配置。

    @Configuration
    public static class RestConfig extends RepositoryRestConfigurerAdapter {
    
        @Override
        public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
                config.setDefaultPageSize(50);
        }
    
    }
    

    【讨论】:

      【解决方案6】:

      你可以在application.yml下面设置

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

      【讨论】:

      • 我已经尝试了很多方法让这个设置生效,但似乎不想生效(1.4.3.RELEASE)——有什么建议吗? spring.data.rest.default-page-size: 99
      • 该设置可能仅在您使用 spring-data-rest HATEOS 框架时才相关
      • 设置Page Size=60不会报错,如何处理?
      【解决方案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));
      }
      

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

      【讨论】:

      • 在这种方法中,您不能从请求中设置size。它总是会被默认值覆盖。
      • @djxak,是的,你是对的。我刚刚添加了有关限制的信息;谢谢。
      【解决方案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);
      }
      

      【讨论】:

      • 这在 2.1.x.RELEASE 版本中已被弃用
      • 如何设置最大分页大小限制?
      猜你喜欢
      • 2017-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多