justsunset
justsunset

Reputation: 21

org.springframework.data.domain.Pageable return first page number 0

using org.springframework.data.domain.Pageable. I want to start paging number with 1. I saw same post and did, but they doesn't work in my app.

Get spring boot pagination number starts from 1 instead of 0

Spring Data Rest - Configure pagination

build.gradle

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-web'
    compile 'org.springframework.data:spring-data-rest-webmvc'
}

config

import org.springframework.data.web.PageableHandlerMethodArgumentResolver;
import org.springframework.data.web.config.PageableHandlerMethodArgumentResolverCustomizer;
import org.springframework.stereotype.Component;

@Component
public class CustomConfig implements PageableHandlerMethodArgumentResolverCustomizer {
    @Override
    public void customize(PageableHandlerMethodArgumentResolver pr) {
        pr.setOneIndexedParameters(true);
    }
}

controller

@GetMapping("/")
public Integer index(Pageable pageable) {
    return pageable.getPageNumber();
}

result

% curl 'localhost:8080/'
0
% curl 'localhost:8080/?page=1'
0
% curl 'localhost:8080/?page=2'
1

I want to do

% curl 'localhost:8080/'
1
% curl 'localhost:8080/?page=1'
1
% curl 'localhost:8080/?page=2'
2

Upvotes: 2

Views: 3251

Answers (2)

Matthew Daumen
Matthew Daumen

Reputation: 851

FYI, you need to change this:

@GetMapping("/")
public Integer index(Pageable pageable) {
    return pageable.getPageNumber();
}

To this:

@GetMapping("/")
public Integer index(
    @RequestParam(value = "page", required = false, defaultValue = "0") int page,
    @RequestParam(value = "size", required = false, defaultValue = "10") int size,
    @PageableDefault(value = 10, page = 0) Pageable pageable) {
  return pageable.getPageNumber();
}

You need to have those GET parameters in your request so that Spring can coerce them into the Pageable object, and you can define them in this way, choose names for them, etc...

Since this process of coercion/binding is what the spring.data.web.pageable.one-indexed-parameters property works on, this is how the request needs to look.

Upvotes: 0

Alien
Alien

Reputation: 15878

Try configuring with WebMvcConfigurerAdapter like below way instead of directly implementing PageableHandlerMethodArgumentResolverCustomizer.

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

If you are using Spring Boot 2.X you could switch from WebMvcConfigurerAdapter to application properties like below:

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

Upvotes: 2

Related Questions