web-dev-qa-db-fra.com

Comment configurer la pagination de démarrage Spring à partir de la page 1, pas

boot (1.4.0) "Pageable" pour la pagination.Il fonctionne correctement sans problème.Mais par défaut, la valeur de la page commence à "0" mais dans l'interface la valeur de la page commence à "1". Y a-t-il une approche standard pour incrémenter la valeur au lieu d'incrémenter manuellement le numéro de page dans le code?

public Page<Device> find(DeviceFindCommand deviceFindCommand, Pageable pageable){
//page = 0 //Actual is 0, Expected increment by 1. 
}

Toute aide devrait être appréciable.

Après avoir implémenté les réponses Alan ayant les problèmes suivants,

1) Je peux quand même accéder à zéro page qui retourne la première page (je ne sais pas si c'est un problème ou non, mais je souhaite obtenir une meilleure clarté).

http: // localhost: 8180/api/v1/livres /? page = 3 & size = 2

Réponse

{
    "content": [
{
  "id": "57da9eadbee83fb037a66029",
  .
  .
  .
}{
.
.
.
}
],
    "last": false,
    "totalElements": 5,
    "totalPages": 3,
    "size": 2,
    "number": 2, //strange always getting 1 less than page number.
    "sort": null,
    "first": true,
    "numberOfElements": 2
}

2) "numéro": 2, dans la réponse obtenant toujours un moins que le numéro de page.Il devrait renvoyer l'index de page actuel.

12
VelNaga

Si vous utilisez Spring Boot 2.X, vous pouvez passer de WebMvcConfigurerAdapter aux propriétés de l'application. Il y a un ensemble de propriétés à configurer paginable:

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

Mais rappelez-vous que même si vous modifiez le one-indexed-parameter, la réponse de la page (PageImpl class) renverra les résultats avec un numéro de page de base zéro. Cela pourrait être un peu trompeur.

6
Przemek Nowak

Spring Boot utilisera Spring Data sous les couvertures.

La classe Spring Data que vous devez configurer est la suivante:

org.springframework.data.web.PageableHandlerMethodArgumentResolver

et en particulier la méthode suivante:

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

Cela vous permettra d’utiliser la pagination actuelle de votre interface utilisateur telle quelle avec la première page = 1.

Dans une application de démarrage, je pense que la configuration peut ressembler à:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {


    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
        resolver.setOneIndexedParameters(true);
        argumentResolvers.add(resolver);
        super.addArgumentResolvers(argumentResolvers);
    }
}
6
Alan Hay

Je travaille avec Spring boot et Vue.js et j'ai eu ce problème :) 

J'ai beaucoup de documents et j'ai donc implémenté Pageable comme ceci: 

    @GetMapping("/all")
public Iterable<Document> getAll(@RequestParam(name = "page", required = false, defaultValue = "0") Integer page)
{
    this.connectToDatabase();

    if(page == null){
        page = 0;
    }

    if(page >= 1){
        // Front-end problem forces us to mad solutions
        page--;
    }

    Sort sort = new Sort(new Sort.Order(Sort.Direction.ASC, "id"));
    Pageable pageable = new PageRequest(page,15, sort);
    Iterable<Document> d = null;
    try{
        d = this.repository.findAll(pageable);
    }catch (Exception e){
        logger.error("Could not find documents in the database.", e);
    }

    return d;
}

J'appelle pour la première fois document/all et la page 0 s'affiche. Chaque fois que j'appelle une page depuis mon application frontale, le page = page -1;

Donc, quand j'appelle la page 1 depuis le front-end, cela passe à la page 0 dans le back-end, etc. 

1
Grechka Vassili

Pour obtenir de meilleurs résultats, vous devez étendre RepositoryRestMvcConfiguration, comme ci-dessous.

@Configuration
   public class RespositoryConfiguration extends RepositoryRestMvcConfiguration {

    @Override
    @Bean
    public HateoasPageableHandlerMethodArgumentResolver pageableResolver() {

        HateoasPageableHandlerMethodArgumentResolver resolver = super.pageableResolver();
        resolver.setOneIndexedParameters(true);
        return resolver;
    }
}

Ensuite, vous obtiendrez tous les liens et informations de pagination corrects à l'exception de 'nombre', qui représente un de moins . Voir le résultat pour page = 1

  "_links": {
    "first": {
      "href": "http://localhost:8080/user/user?page=1&size=5"
    },
    "self": {
      "href": "http://localhost:8080/user/user"
    },
    "next": {
      "href": "http://localhost:8080/user/user?page=2&size=5"
    },
    "last": {
      "href": "http://localhost:8080/user/user?page=2&size=5"
    }
  },
  "page": {
    "size": 5,
    "totalElements": 6,
    "totalPages": 2,
    "number": 0
  }
0
Shafiul