Domanda Imposta la dimensione della pagina predefinita per l'oggetto pagabile JPA


Ho un deposito PagingandSorting che ha un metodo che accoda un oggetto paginabile. Ho anche un controller che accetta un oggetto paginabile attraverso l'URL.

Il mio caso d'uso è che, se un utente specifica un parametro della dimensione della pagina nell'URL, devo prendere quel valore per l'oggetto paginabile. Se non menziona, prendi un valore predefinito di 50.

Ma l'oggetto paginabile è impostato su 20 al momento.

Qualsiasi suggerimento sarebbe d'aiuto


11
2017-11-20 05:31


origine


risposte:


Se si sta parlando di Spring Data PagingAndSortingRepository, è possibile impostare le dimensioni della pagina predefinite utilizzando @PageableDefault su un metodo Controller come segue:

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

    }

Oppure puoi configurare un default globale usando quanto segue nella tua Spring config come mostrato di seguito sia in XML che in Java.

Si noti che le versioni più recenti di Spring Data utilizzano l'indicizzazione delle pagine basata su zero mentre le versioni precedenti utilizzavano 1 per la prima pagina. Se la libreria di paging dell'interfaccia utente prevede 1 come prima pagina, è possibile impostare il file oneIndexedParameters proprietà a true:

Configura se esporre e assumere indici di numeri di pagina basati su 1 in   i parametri della richiesta. Il valore predefinito è false, ovvero un numero di pagina pari a 0   nella richiesta è uguale alla prima pagina. Se è impostato su true, una pagina   il numero di 1 nella richiesta sarà considerato la prima pagina.

Parametri: oneIndexedParameters - theIndexedParameters da impostare

Configura il Pageable da utilizzare come fallback nel caso in cui nessun PageableDefault o   PageableDefaults (quest'ultimo supportato solo in modalità legacy) può essere   trovato al parametro metodo da risolvere. Se si imposta questo su null,   essere consapevoli del fatto che i metodi del controllore otterranno in essi una mano nulla   caso non è possibile trovare dati rintracciabili nella richiesta. Nota, così facendo   richiederà di fornire bot alla pagina e il parametro size con il   richieste in quanto non ci sarà alcun valore predefinito per nessuno dei parametri   a disposizione.

Parametri: fallbackPageable - il Pageable da utilizzare come generale   ricaderci.

In XML questo aspetto è il seguente:

<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 questo è il seguente:

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

37
2017-11-20 08:22



È possibile impostare di seguito in application.yml

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

12
2017-12-03 09:54



E, per completezza, ecco un esempio per una configurazione Spring Boot. Nella classe @Configuration che estende WebMvcConfigurerAdapter, imposta la dimensione della pagina predefinita su 50 elementi come questo:

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

8
2017-12-16 22:39



Per Spring Boot 2.X hai un set di parametri:

# DATA WEB (SpringDataWebProperties)
spring.data.web.pageable.default-page-size=20 # Default page size.
spring.data.web.pageable.max-page-size=2000 # Maximum page size to be accepted.
spring.data.web.pageable.one-indexed-parameters=false # Whether to expose and assume 1-based page number indexes.
spring.data.web.pageable.page-parameter=page # Page index parameter name.
spring.data.web.pageable.prefix= # General prefix to be prepended to the page number and page size parameters.
spring.data.web.pageable.qualifier-delimiter=_ # Delimiter to be used between the qualifier and the actual page number and size properties.
spring.data.web.pageable.size-parameter=size # Page size parameter name.
spring.data.web.sort.sort-parameter=sort # Sort parameter name.

6
2018-03-30 13:27



Questo non è ancora ben documentato, ma per chiunque altro trovando questo articolo, RepositoryRestConfigurerAdapter ha tutto il resto dei dati di primavera config lì.

@Configuration
public static class RestConfig extends RepositoryRestConfigurerAdapter {

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

}

1
2018-05-17 18:48



Le risposte fornite sono molto buone e dovrebbero aiutare nella maggior parte dei casi. Tuttavia, utilizzo un approccio leggermente diverso, che mi consente di utilizzare diverse dimensioni di pagina predefinite per modello e può essere configurabile con Spring o proprietà di sistema.

Si noti che questo approccio ha una limitazione fondamentale, vale a dire, non accetta alcuna dimensione che arriva con una richiesta; tuttavia utilizza le informazioni di ordinamento. Quindi, se hai bisogno di modificare il numero di articoli restituiti per pagina tramite i parametri di richiesta, questa soluzione non fa per te.

Prima di tutto, ho creato una classe di utilità (o solo un metodo in un controller) che crea una nuova Pageable istanza di base su una richiesta Pageable e dimensione della pagina configurata

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

In un controller aggiungo una variabile che contiene la dimensione della pagina predefinita (in questo caso il valore predefinito è 20 se la configurazione non è fornita):

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

E poi io oltrepassare (crea un nuovo Pageable istanza) dimensione della pagina predefinita nel metodo di gestione delle richieste:

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

Uso variabili di dimensioni di pagina predefinite diverse per diversi modelli / controller che possono quindi essere configurati anche dalle proprietà di sistema.


0
2017-09-11 15:13



Puoi usare questa annotazione prima del tuo parametro Pageable:

@PageableDefault(size = 40)

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

0
2017-10-28 06:54