2015-07-13 74 views
8

我正在使用spring-data-rest和JpaRepository來創建Rest-Endpoints。默認情況下,對所有JpaRepository啓用分頁,什麼是好事。但是我有一個遺留的應用程序,我們將它移植到不支持分頁的新堆棧。我想根據URL參數禁用分頁,以便仍然能夠在新的應用程序代碼中使用分頁。如何在spring-data-rest中禁用JpaRepository的分頁

我嘗試了各種方法來使用和不使用分頁露出資源:

  • 使用CrudRepository:結果只能有一個未分頁端點和方法flush丟失。
  • 覆蓋我的知識庫接口中的List<T> findAll()方法,並使用RestResource對其進行註釋。我本來期望該方法將作爲搜索方法公開,但事實並非如此。
  • 註釋Page<T> findAll(Pageable pageable)@RestResource(exported=false)和註釋List<T> findAll()如在之前的項目符號。我已經跳過,這取代了默認的方法。但無論如何,這並非有效的解決方案,因爲只有非分頁端點纔會暴露。
  • 通行證size=-1獲得一個不受限制的結果 - >默認分頁大小用來

我已經看到了春天控制器RepositoryEntityController使用RepositoryInvoker來調用庫中的方法。 Pageable使用PageableHandlerMethodArgumentResolver解決,它總是返回一個可分頁(在查詢中指定,註釋或默認可分頁)。 我目前看到的唯一解決方案是實現自定義PageableHandlerMethodArgumentResolver,如果傳遞自定義url參數,則返回null。

您是否知道其他解決方案或類似未來的計劃?

感謝, 米莎

回答

2

你可以添加自己的方法來存儲庫接口,並有List<DomainObject>Collection<DomainObject>返回類型,沒有Pageable參數。這將導致使用非分頁響應。然後,您可以將您的舊客戶端指向那些方法而不是默認的客戶端。

或者,您可以將默認頁面大小配置爲非常大。在application.properties中設置spring.data.rest.default-page-size

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