2014-11-20 7 views
8

Ich habe ein PagingandSorting-Repository mit einer Methode, die ein seitenfähiges Objekt akzeptiert. Ich habe auch einen Controller, der ein seitenfähiges Objekt über die URL akzeptiert.Festlegen der Standardseitengröße für JPA-Umlagerungsobjekt

Mein Anwendungsfall ist, dass, wenn ein Benutzer einen Seitengrößenparameter in der URL angibt, ich diesen Wert für das auslagerbare Objekt nehmen muss. Wenn er nicht erwähnt, nehmen Sie einen Standardwert von 50.

Aber das auslagerbare Objekt ist standardmäßig 20 jetzt.

Irgendwelche Vorschläge

+0

Ich bin nicht mit PagingAndSortingRepository in JPA vertraut. Wenn dies eine Spring Data-Frage ist, geben Sie bitte an, dass dies der Fall ist. –

Antwort

32

helfen würde, wenn Sie eine Spring Data PagingAndSortingRepository sprechen werden über Sie die Standardseitengröße unter Verwendung des @PageableDefault auf einem Controller-Methode wie folgt einstellen:

public String listClients(@ModelAttribute FilterForm form, Model model, WebRequest request, @PageableDefault(sort = { "surname", 
      "forename", "address.town" }, value = 50) Pageable pageable) { 

    } 

Oder Sie können konfigurieren ein globaler Standard, der Folgendes in Ihrer Spring-Konfiguration verwendet, wie unten in der XML- und Java-Konfiguration gezeigt.

Beachten Sie, dass neuere Versionen von Spring Data nullseitige Seitenindizierung verwenden, während ältere Versionen 1 für die erste Seite verwendeten. Wenn Ihre UI-Paging-Bibliothek 1 als erste Seite erwartet, dann können Sie die oneIndexedParameters Eigenschaft auf true gesetzt:

http://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/web/PageableHandlerMethodArgumentResolver.html#setOneIndexedParameters-boolean-

public void setFallbackPageable (Pageable fallbackPageable)

die Pageable Konfiguriert verwendet werden als Fallback für den Fall, dass kein PageableDefault oder PageableDefaults (Letzteres wird nur im Legacy-Modus unterstützt) kann gefunden werden, um den zu lösenden Methodenparameter. Wenn Sie dies auf null setzen, müssen Sie sich bewusst sein, dass Ihre Controller-Methoden in null-übergeben werden. Case nein In der Anforderung können umsetzbare Daten gefunden werden. Beachten Sie, dass Sie in diesem Fall anfordern müssen, um die Seite und den Größenparameter mit den Anforderungen zu liefern, da für die Parameter kein Standardwert verfügbar ist.

Parameter: fallbackPageable - die Auslagerungsdatei, die als allgemeiner Fallback verwendet werden soll.

In XML sieht dies wie folgt aus dann:

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

In Java Config dies die unten wie folgt aussieht:

@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); 
    } 
} 
+0

Danke, Alan. Aber es ist eher name = "page" value = "0" für die globale Konfiguration, oder? – Mikhail

+0

Ja. Es gab einen Wechsel von 1 zu 0 basierten Index zu einem bestimmten Zeitpunkt, obwohl Sie dies immer noch überschreiben können, um den ersten zu verwenden, falls erforderlich. Ich werde aktualisieren, wenn ich eine Minute habe. –

7

Und der Vollständigkeit halber, hier ist ein Beispiel für eine Feder Boot-Konfiguration. In der @Configuration Klasse, die WebMvcConfigurerAdapter, stellen Sie die Standardseitengröße auf 50 Einzelteile so erweitert:

@Override 
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { 
    PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver(); 
    resolver.setFallbackPageable(new PageRequest(0, 50)); 
    argumentResolvers.add(resolver); 
    super.addArgumentResolvers(argumentResolvers); 
} 
0

gibt Antworten sind sehr gut und sollen dazu beitragen, in den meisten Fällen. Ich verwende jedoch einen etwas anderen Ansatz, der es mir erlaubt, verschiedene Standardseitengrößen pro Modell zu verwenden und kann mit Spring- oder Systemeigenschaften konfiguriert werden.

Bitte beachten Sie, dass dieser Ansatz eine grundlegende Einschränkung hat, nämlich dass er keine Größe akzeptiert, die mit einer Anfrage kommt; Es verwendet jedoch Sortierinformationen. Wenn Sie also die Anzahl der zurückgegebenen Artikel pro Seite über Anforderungsparameter ändern möchten, ist diese Lösung nicht für Sie geeignet.

Zu allererst habe ich eine Utility-Klasse (oder nur ein Verfahren in einem Controller), die auf eine Anforderung Pageable und konfiguriert Seitengröße

public static Pageable updatePageable(final Pageable source, final int size) 
{ 
    return new PageRequest(source.getPageNumber(), size, source.getSort()); 
} 

in einer Steuerung eine neue Pageable Instanz Basis schafft I a fügen Variable, die meine Standard-Seitengröße hält (in diesem Fall Standardwert ist 20, wenn Konfiguration nicht vorgesehen ist):

@Value("${myapplication.model.items-per-page:20}") 
private int itemsPerPage; 

Und dann ich außer Kraft setzen (dh erstellen Sie eine neue Pageable Beispiel) Standardseitengröße in Anforderungshandhabungsmethode:

@RequestMapping(method = RequestMethod.GET) 
public Page<Model> websites(final Pageable pageable) 
{ 
    return repository.findAll(updatePageable(pageable, itemsPerPage)); 
} 

I verwenden verschiedene Standard-Seitengröße Variablen für verschiedene Modelle/Controller, die dann auch von den Systemeigenschaften konfiguriert werden können.

+0

Bei dieser Methode können Sie die 'Größe' der Anfrage nicht festlegen. Es wird immer vom Standardwert überschrieben. – djxak

+0

@djxak, ja, du hast Recht. Ich habe gerade Informationen zur Begrenzung hinzugefügt; Vielen Dank. – Tom

9

Sie können unten gesetzt in application.yml

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

Ich habe viele Möglichkeiten ausprobiert, diese Einstellung zum Laufen zu bringen und scheint nicht zu wirken (1.4.3.RELEASE) - haben Sie irgendwelche Vorschläge? 'spring.data.rest.default-page-size: 99' – Larchy

0

Dies ist nach wie vor nicht gut dokumentiert, aber für alle anderen in diesem Artikel zu finden, hat die RepositoryRestConfigurerAdapter die alle Federdaten dort Ruhe Config.

@Configuration 
public static class RestConfig extends RepositoryRestConfigurerAdapter { 

    @Override 
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { 
      config.setDefaultPageSize(50); 
    } 

} 
0

können Sie diese Annotation verwenden, bevor Sie Pageable param:

@PageableDefault(size = 40) 

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