wake-up-neo.com

So konfigurieren Sie die Spring-Boot-Paginierung ab Seite 1, nicht

boot (1.4.0) "Pageable" für Paginierung. Funktioniert problemlos ohne Probleme. Standardmäßig beginnt der Seitenwert jedoch mit "0", im Frontend beginnt der Seitenwert jedoch mit "1". Gibt es einen Standardansatz, um den Wert zu erhöhen, anstatt die Seitennummer manuell im Code zu erhöhen?

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

Jede Hilfe sollte spürbar sein.

Nachdem Alan Antworten mit den folgenden Problemen implementiert wurden,

1) Ich kann immer noch auf null Seite zugreifen, die die erste Seite zurückgibt (ich weiß nicht, ob dies ein Problem ist oder nicht, aber ich möchte eine bessere Übersichtlichkeit erhalten).

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

Antwort

{
    "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) "number": 2, in der Antwort erhält immer eine Nummer unter der Seitennummer. Der aktuelle Seitenindex sollte zurückgegeben werden.

12
VelNaga

Wenn Sie Spring Boot 2.X verwenden, können Sie von WebMvcConfigurerAdapter zu den Anwendungseigenschaften wechseln. Es gibt eine Reihe von Eigenschaften zum Konfigurieren von pageable:

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

Denken Sie jedoch daran, dass auch bei einer Änderung von one-indexed-parameter die Antwort der Seite (Klasse PageImpl) Ergebnisse mit einer auf Null basierenden Seitennummer zurückgibt. Es könnte etwas irreführend sein.

6
Przemek Nowak

Spring Boot verwendet Spring Data unter der Abdeckung.

Die Spring Data-Klasse, die Sie konfigurieren müssen, lautet wie folgt:

org.springframework.data.web.PageableHandlerMethodArgumentResolver

und insbesondere die folgende Methode:

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

Auf diese Weise können Sie Ihr aktuelles UI-Paging verwenden, d. H. Mit erster Seite = 1.

In einer Bootanwendung denke ich, dass die Konfiguration so aussehen könnte:

@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

Ich arbeite mit Spring Boot und Vue.js und hatte dieses Problem :) 

Ich habe viele Dokumente, also habe ich Pageable so implementiert: 

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

Zum ersten Mal rufe ich document/all an und erhalte die Seite 0. Dann rufe ich jedes Mal, wenn ich eine Seite aus meiner Front-End-App anrufe, den page = page -1; auf. 

Wenn ich also Seite 1 vom Frontend aus anrufe, wird im Backend usw. auf Seite 0 gewechselt. 

1
Grechka Vassili

Um ein besseres Ergebnis zu erzielen, müssen Sie RepositoryRestMvcConfiguration wie unten beschrieben erweitern

@Configuration
   public class RespositoryConfiguration extends RepositoryRestMvcConfiguration {

    @Override
    @Bean
    public HateoasPageableHandlerMethodArgumentResolver pageableResolver() {

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

Dann erhalten Sie alle Links und Informationen zur Paginierung, mit Ausnahme von "number", einer Zahl weniger.

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