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.
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.
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:
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);
}
}
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.
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
}