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