2015-07-13 19 views
8

Sto usando spring-data-rest con JpaRepository per creare i rest-endpoint. Per impostazione predefinita, il paging è abilitato per tutti JpaRepository, ciò che è una buona cosa. Ma ho un'applicazione legacy che portiamo al nostro nuovo stack che non supporta il paging. Vorrei disattivare il paging a seconda di un parametro URL per poter ancora utilizzare il cercapersone nel nuovo codice dell'applicazione.Come disattivare il paging per JpaRepository in spring-data-rest

ho provato vari approcci per esporre le risorse con e senza paginazione:

  • Uso CrudRepository: Risultati in solo avere un unpaged endpoint e il metodo flush manca.
  • Sovrascrivere il metodo List<T> findAll() nell'interfaccia del repository e annotarlo con RestResource. Mi sarei aspettato che il metodo fosse esposto come metodo di ricerca, ma non lo è.
  • Annota Page<T> findAll(Pageable pageable) con @RestResource(exported=false) e annota List<T> findAll() come nel punto precedente. Ho saltato che questo sostituisce il metodo predefinito. Ma questa non è comunque una soluzione valida, poiché viene esposto solo un endpoint non di paging.
  • Passo size=-1 per ottenere un risultato illimitato -> dimensione di paging predefinito viene utilizzato

ho visto che la molla controller RepositoryEntityController utilizza un RepositoryInvoker per chiamare i metodi sulla repository. Lo Pageable viene risolto utilizzando lo PageableHandlerMethodArgumentResolver che restituisce sempre un paginabile (specificato in query, annotato o predefinito paginabile). L'unica soluzione che vedo per il momento è implementare un codice personalizzato PageableHandlerMethodArgumentResolver che restituisce null, se viene passato un parametro URL personalizzato.

Conoscete altre soluzioni o qualcosa di simile pianificato per il futuro?

Grazie, Micha

risposta

2

Si potrebbe aggiungere i propri metodi all'interfaccia Repository, e hanno un tipo di ritorno di List<DomainObject> o Collection<DomainObject> e nessun parametro Pageable. Ciò causerà l'utilizzo di una risposta non di paging. È quindi possibile puntare il client legacy su quei metodi anziché su quelli predefiniti.

Oppure, è possibile configurare la dimensione della pagina predefinita per essere molto grande. Impostare spring.data.rest.default-page-size in application.properties.

3

Io uso PagingAndSortingRepository e questo config per impostare il mio 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; 
    } 
} 

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

In questo modo se la pagina e le dimensioni sono incluse nella richiesta si ottiene la pagina richiesta, ma se sono non nella richiesta ottieni tutti i record. In entrambi i casi, se viene specificato un ordinamento, viene utilizzato per ordinare i dati. Nel secondo caso, i record vengono restituiti all'interno di una pagina, ma posso conviverci.

EDIT https://jira.spring.io/browse/DATACMNS-929 è stato fissato, quindi con le nuove versioni sarete in grado di configurare il resolver con un null fallbackPageable.In questo modo, quando paginabile dati (cioè page e size) è presente si recupera una pagina, ma quando non sei tu recuperare tutti i record:

@Configuration 
public class RestApiConfiguration extends RepositoryRestConfigurerAdapter { 

    @Bean 
    public HateoasPageableHandlerMethodArgumentResolver customResolver(
     HateoasPageableHandlerMethodArgumentResolver pageableResolver) { 
     pageableResolver.setOneIndexedParameters(true); 
     pageableResolver.setFallbackPageable(null); 
     return pageableResolver; 
    } 
} 
Problemi correlati