【问题标题】:How to disable paging for JpaRepository in spring-data-rest如何在 spring-data-rest 中禁用 JpaRepository 的分页
【发布时间】:2015-10-01 12:18:28
【问题描述】:

我正在使用 JpaRepository 来创建 Rest-Endpoints。默认情况下,为所有JpaRepository启用分页,这是一件好事。但是我有一个遗留应用程序,我们将它移植到不支持分页的新堆栈。我想根据 URL 参数禁用分页,以便仍然能够在新的应用程序代码中使用分页。

我尝试了各种方法来公开资源(有和没有分页):

  • 使用CrudRepository:导致只有一个未分页的端点并且缺少flush方法。
  • 在我的存储库接口中覆盖List<T> findAll() 方法并使用RestResource 对其进行注释。我原以为该方法将作为搜索方法公开,但事实并非如此。
  • @RestResource(exported=false) 注释Page<T> findAll(Pageable pageable) 并像前面的子弹一样注释List<T> findAll()。我希望这取代了默认方法。但这无论如何都不是有效的解决方案,因为只公开了一个非分页端点。
  • 传递size=-1 以获得无限结果 -> 使用默认分页大小

我已经看到弹簧控制器RepositoryEntityController 使用RepositoryInvoker 来调用存储库上的方法。 Pageable 使用 PageableHandlerMethodArgumentResolver 解析,它始终返回可分页(在查询中指定、注释或默认可分页)。 我目前看到的唯一解决方案是实现一个自定义 PageableHandlerMethodArgumentResolver,如果传递了自定义 url 参数,则返回 null。

您是否知道任何其他解决方案或未来是否有类似的计划?

【问题讨论】:

    标签: spring-data-rest paging spring-data-rest


    【解决方案1】:

    评分最高的答案表示setFallbackPageable 为空,不再有效。像这样使用PageRequest 的默认静态构造函数:

    @Configuration
    public class RestApiConfiguration extends RepositoryRestConfigurerAdapter {
    
        @Bean
        public HateoasPageableHandlerMethodArgumentResolver customResolver(
            HateoasPageableHandlerMethodArgumentResolver pageableResolver) {
            pageableResolver.setOneIndexedParameters(true);
            pageableResolver.setFallbackPageable(PageRequest.of(0, Integer.MAX_VALUE));
            pageableResolver.setMaxPageSize(Integer.MAX_VALUE);
            return pageableResolver;
        }
    }
    

    【讨论】:

      【解决方案2】:

      这不是最干净的解决方案,但以下代码允许您将unpaged=true 作为查询参数传递,以便在一页中获取所有结果。

      @Configuration
      public class RestApiServletConfig implements WebMvcConfigurer {
          @Override
          public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
              PageableHandlerMethodArgumentResolver pageableResolver = new PageableHandlerMethodArgumentResolver() {
                  @Override
                  public Pageable resolveArgument(MethodParameter methodParameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
                      if ("true".equals(webRequest.getParameter(getParameterNameToUse("unpaged", methodParameter)))) {
                          return Pageable.unpaged();
                      }
      
                      return super.resolveArgument(methodParameter, mavContainer, webRequest, binderFactory);
                  }
              };
              resolvers.add(pageableResolver);
          }
      }
      

      【讨论】:

        【解决方案3】:

        我使用 PagingAndSortingRepository 和这个配置来设置我的 pageableResolver:

        @Configuration
        public class RestApiConfiguration extends RepositoryRestConfigurerAdapter {
        
            @Bean
            public HateoasPageableHandlerMethodArgumentResolver customResolver(
                HateoasPageableHandlerMethodArgumentResolver pageableResolver) {
                pageableResolver.setOneIndexedParameters(true);
                pageableResolver.setFallbackPageable(new PageRequest(0, Integer.MAX_VALUE));
                pageableResolver.setMaxPageSize(Integer.MAX_VALUE);
                return pageableResolver;
            }
        }
        

        见:https://jira.spring.io/browse/DATACMNS-929

        这样,如果页面和大小包含在请求中,您将获得请求的页面,但如果它们不在请求中,您将获得所有记录。在这两种情况下,如果指定了排序,它将用于对数据进行排序。 在第二种情况下,记录在页面内返回,但我可以接受。

        编辑 https://jira.spring.io/browse/DATACMNS-929 已修复,因此在新版本中,您将能够使用 null fallbackPageable 配置解析器。这样,当存在可分页数据(即pagesize)时,您检索一页,但当不存在时,您检索所有记录:

        @Configuration
        public class RestApiConfiguration extends RepositoryRestConfigurerAdapter {
        
            @Bean
            public HateoasPageableHandlerMethodArgumentResolver customResolver(
                HateoasPageableHandlerMethodArgumentResolver pageableResolver) {
                pageableResolver.setOneIndexedParameters(true);
                pageableResolver.setFallbackPageable(null);
                return pageableResolver;
            }
        }
        

        【讨论】:

          【解决方案4】:

          您可以将自己的方法添加到 Repository 接口,并且返回类型为 List&lt;DomainObject&gt;Collection&lt;DomainObject&gt; 并且没有 Pageable 参数。这将导致使用非分页响应。然后,您可以将旧客户端指向这些方法,而不是默认方法。

          或者,您可以将默认页面大小配置为非常大。在application.properties 中设置spring.data.rest.default-page-size

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-11-23
            • 2014-01-29
            • 1970-01-01
            • 1970-01-01
            • 2016-02-01
            • 2021-06-24
            • 1970-01-01
            • 2017-04-04
            相关资源
            最近更新 更多