web-dev-qa-db-fra.com

Définition de la taille de page par défaut pour un objet paginé JPA

J'ai un référentiel PagingandSorting qui a une méthode qui permet d'accéder à un objet paginable ... J'ai également un contrôleur qui accepte un objet paginable via l'URL.

Mon cas d'utilisation est le suivant: si un utilisateur spécifie un paramètre de taille de page dans l'URL, je dois prendre cette valeur pour l'objet paginable. S'il ne mentionne pas, prenez une valeur par défaut de 50. 

Par défaut, l’objet paginable a la valeur 20 pour le moment.

Toute suggestion aiderait

Si vous parlez d'un Spring Data PagingAndSortingRepository, vous pouvez définir la taille de page par défaut à l'aide de @PageableDefault sur une méthode contrôleur comme suit:

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

    }

Ou vous pouvez configurer une valeur globale par défaut en utilisant les éléments suivants dans votre configuration Spring, comme indiqué ci-dessous dans les configurations XML et Java. 

Notez que les versions les plus récentes de Spring Data utilisent l'indexation de page basée sur zéro alors que les versions antérieures en utilisaient 1 pour la première page. Si votre bibliothèque de pagination d'interface utilisateur attend 1 comme première page, vous pouvez définir la propriété oneIndexedParameters sur true

Configure s'il faut exposer et supposer des index de numéro de page basés sur 1 dans les paramètres de la demande. La valeur par défaut est false, ce qui signifie un numéro de page de 0 dans la demande égale la première page. Si cela est défini sur true, une page Le nombre 1 dans la demande sera considéré comme la première page.

Paramètres: oneIndexedParameters - les oneIndexedParameters à définir

Configure le Pageable pour qu’il soit utilisé comme solution de secours au cas où aucun PageableDefault ou PageableDefaults (ce dernier pris en charge uniquement en mode hérité) peut être trouvé au paramètre de méthode à résoudre. Si vous définissez ceci sur null, sachez que vos méthodes de contrôleur vont recevoir une valeur nulle case aucune donnée pageable ne peut être trouvée dans la requête. Notez que cela Vous devrez fournir à la page et au paramètre de taille la valeur demandes car il n'y aura pas de valeur par défaut pour aucun des paramètres disponible.

Paramètres: fallbackPageable - le Pageable à utiliser comme général se retirer.

En XML, cela ressemble à ce qui suit:

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

Dans Java Config, cela ressemble à ce qui suit:

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

Vous pouvez définir ci-dessous dans application.yml

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

Pour Spring Boot 2.X, vous avez défini les paramètres suivants:

# 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.
11
Przemek Nowak

Et, pour être complet, voici un exemple de configuration Spring Boot. Dans la classe @Configuration qui étend WebMvcConfigurerAdapter, définissez la taille de page par défaut sur 50 éléments, comme suit:

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

Vous pouvez utiliser cette annotation avant votre paramètre Pageable:

@PageableDefault(size = 40)

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

Cela n’est pas encore bien documenté, mais pour ceux qui trouveront cet article, le RepositoryRestConfigurerAdapter aura toute la config de données printanière.

@Configuration
public static class RestConfig extends RepositoryRestConfigurerAdapter {

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

}
1
jasondt

Les réponses fournies sont très bonnes et devraient aider dans la plupart des cas. Cependant, j'utilise une approche légèrement différente, ce qui me permet d'utiliser différentes tailles de page par défaut pour chaque modèle et peut être configurée avec les propriétés Spring ou du système. 

Veuillez noter que cette approche a une limite fondamentale, à savoir qu’elle n’accepte aucune taille avec une demande; il utilise cependant des informations de tri. Donc, si vous avez besoin de la possibilité de changer le nombre d'éléments retournés par page via les paramètres de demande, cette solution n'est pas pour vous.

Tout d'abord, j'ai créé une classe d'utilitaire (ou simplement une méthode dans un contrôleur) qui crée une nouvelle base d'instance Pageable sur une requête Pageable et une taille de page configurée. 

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

Dans un contrôleur, j'ajoute une variable qui contient la taille de page par défaut (dans ce cas, la valeur par défaut est 20 si la configuration n'est pas fournie): 

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

Et ensuite, je override (c'est-à-dire créer une nouvelle instance de Pageable) par défaut dans la méthode de traitement des demandes:

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

J'utilise différentes variables de taille de page par défaut pour différents modèles/contrôleurs, qui peuvent ensuite être configurées même à partir des propriétés du système.

0
Tom