30

boot(1.4.0) "Pageable" for pagination.It works fine without any issue.But by default the page value starts from "0" but in the front-end the page value starts from "1". So is there any standard approach to increment value instead of manually increment the page number inside the code?

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

Any help should be appreciable.

After implementing Alan answers having the following issues,

1) Still i am able to access zero page which returns the first page(I don't know this is issue or not but i want to get a better clarity).

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

Response

{
    "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 the response always getting one less than the page number.It should return the current page index.

Shafiul
  • 1,452
  • 14
  • 21
VelNaga
  • 3,593
  • 6
  • 48
  • 82

4 Answers4

23

Spring added this future as well. Just make oneIndexed parameter equals to true in your configuration file and pagination will start from page 1.By default its false and pagination starts from 0.

spring.data.web.pageable.one-indexed-parameters=true
Koray Tugay
  • 22,894
  • 45
  • 188
  • 319
user3414260
  • 257
  • 2
  • 6
18

If you are using Spring Boot 2.X you could switch from WebMvcConfigurerAdapter to application properties. There is a set of properties to configure 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.

But please remember that even if you change the one-indexed-parameter the page response (PageImpl class) will return results with zero-based page number. It could be a little misleading.

ivoputzer
  • 6,427
  • 1
  • 25
  • 43
Przemek Nowak
  • 7,173
  • 3
  • 53
  • 57
  • 3
    I submitted an issue regarding the response displaying a zero based current page even if configuring for a one based pagination https://jira.spring.io/browse/DATACMNS-563 I must admit I am still confused as to what is expected by the api here. – Stephane Oct 02 '18 at 12:20
8

Spring Boot will be using Spring Data under the covers.

The Spring Data class you need to configure is the following:

org.springframework.data.web.PageableHandlerMethodArgumentResolver

and in particular the following method:

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

This will allow you to use you current UI paging as is i.e. with first page = 1.

In a Boot application I think the config may look something like:

@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);
    }
}
Alan Hay
  • 22,665
  • 4
  • 56
  • 110
  • 1
    It is working but i am facing couple of issues.still i am able to access the zero indexed page URL "/books?page=0&size=2".Then "number" attribute in the response is still zero indexed, I am accessing page:3 but getting number attribute as 2, "last": true,"totalElements": 5, "totalPages": 3,"size": 2,"number": 2,"sort": null,"first": false, "numberOfElements": 1". Please guide me to resolve this issue. – VelNaga Oct 06 '16 at 10:22
  • Sorry but I do not understand the issue: You want to use 1 based paging but call "/books?page=0&size=2" – Alan Hay Oct 06 '16 at 10:27
  • let me edit my question so that you will get a better clarity – VelNaga Oct 06 '16 at 10:27
  • I have edited my post please guide me to resolve this – VelNaga Oct 06 '16 at 10:35
  • Did you find the solution for this? – ahmedjaad Jun 27 '18 at 13:02
  • 1
    I have the same problem in the response. To follow your example, if I request: /books?page=1 then I get a page object in the response, page: { ... number: 0 ... }. The page.number returns 0 when I asked for page 1. page.number = 1 when I ask for page 2 etc. – gary Dec 17 '18 at 10:43
  • 1
    Did you guys find solution? I am facing same issue. – Yashika Chandra Mar 30 '23 at 05:31
2

To get better result, you need to extend RepositoryRestMvcConfiguration, like below

@Configuration
   public class RespositoryConfiguration extends RepositoryRestMvcConfiguration {

    @Override
    @Bean
    public HateoasPageableHandlerMethodArgumentResolver pageableResolver() {

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

Then you shall get all the links and pagination information correct except 'number', which is one less. See the result for 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
  }
Shafiul
  • 1,452
  • 14
  • 21