2015-07-13 11 views
8

Ich verwende Spring-Daten-Rest mit JpaRepository, um die Ruhe-Endpunkte zu erstellen. Standardmäßig ist Paging für alle JpaRepository aktiviert, was eine gute Sache ist. Aber ich habe eine Legacy-Anwendung, die wir auf unseren neuen Stack portieren, der kein Paging unterstützt. Ich möchte das Paging abhängig von einem URL-Parameter deaktivieren, um immer noch Paging im neuen Anwendungscode verwenden zu können.So deaktivieren Sie das Paging für JpaRepository im Frühjahr-Datenrest

Ich habe versucht, verschiedene Ansätze, die Ressourcen mit und ohne Paging zu belichten:

  • Verwendung CrudRepository: Ergebnisse in nur einem unpaged Endpunkt mit und die Methode flush fehlt.
  • Überschreiben Sie die List<T> findAll() Methode in meiner Repository-Schnittstelle und kommentiert es mit RestResource. Ich hätte erwartet, dass die Methode als Suchmethode zur Verfügung gestellt wird, ist es aber nicht.
  • Kommentieren Sie Page<T> findAll(Pageable pageable) mit @RestResource(exported=false) und kommentieren Sie List<T> findAll() wie in der Kugel vor. Ich habe gehüpft, dass dies die Standardmethode ersetzt. Dies ist jedoch keine gültige Lösung, da nur ein nicht ausgelagerter Endpunkt verfügbar ist.
  • Pass size=-1 ein unbegrenztes Ergebnis zu erhalten -> Standard-Paging-Größe verwendet wird

ich, dass der Feder-Controller RepositoryEntityController ein RepositoryInvoker verwendet gesehen habe, die Methoden auf dem Repository zu nennen. Die Pageable wird aufgelöst, indem die PageableHandlerMethodArgumentResolver verwendet wird, die immer eine Auslagerungsdatei zurückgibt (angegeben in Abfrage, mit Anmerkungen versehen oder standardmäßig auslagerbar). Die einzige Lösung, die ich im Moment sehe, ist die Implementierung einer benutzerdefinierten PageableHandlerMethodArgumentResolver, die Null zurückgibt, wenn ein benutzerdefinierter URL-Parameter übergeben wird.

Kennen Sie weitere Lösungen oder ist für die Zukunft etwas Ähnliches geplant?

Danke, Micha

Antwort

2

Sie könnten Ihre eigenen Methoden, um die Repository-Schnittstelle, fügen und einen Rückgabetyp von List<DomainObject> oder Collection<DomainObject> und keine Pageable Parameter haben. Dadurch wird eine nicht ausgelagerte Antwort verwendet. Sie können dann Ihren Legacy-Client auf diese Methoden anstatt auf die Standardmethoden verweisen.

Oder Sie könnten die Standard-Seitengröße sehr groß konfigurieren. Set spring.data.rest.default-page-size in application.properties.

3

Ich benutze PagingAndSortingRepository und diese Config mein pageableResolver zu setzen:

@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

diese Weise, wenn Seite und Größe sind in der Anfrage Sie die gewünschte Seite bekommen enthalten, aber wenn sie Nicht in der Anfrage erhalten Sie alle Datensätze. In beiden Fällen wird eine Sortierung verwendet, um die Daten zu sortieren. Im zweiten Fall werden die Datensätze innerhalb einer Seite zurückgegeben, aber ich kann damit leben.

EDIT https://jira.spring.io/browse/DATACMNS-929 wurde behoben, so mit den neuen Versionen können Sie Ihre Resolver mit einem null fallbackPageable konfigurieren.Auf diese Weise, wenn seitenwechselbar Daten (dh page und size) vorhanden ist, Sie eine Seite abzurufen, aber wenn es nicht abrufen Sie alle Datensätze:

@Configuration 
public class RestApiConfiguration extends RepositoryRestConfigurerAdapter { 

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