Ankush Sharma

Software dev from Delhi, India. Interested in high performance web applications. Learning ML!

Easy Pagination with Spring Boot.

03 May 2016

In this short tutorial , we’ll see how easy it is to set up Pagination in a Spring Boot app .


We use Spring Boot 1.3.3.RELEASE , with MySQL as the Database and Spring Data JPA abstraction to work with MySQL. Indeed ,it is the Spring Data JPA module that makes it so easy to set up Pagination in a Spring boot app in the first place.


We expose an endpoint /persons . It will return a List of persons and other paging info(which we would see in a minute) based on the page and size parameters that were passed along with it.

For instance , /persons?page=0&size=3 would return a batch of the first 3 persons from the database /persons?page=1&size=3 would return the next batch .

To begin with, we create a domain Person class .

class Person {
	Integer id
	String name
	Integer age

This is how our Controller looks like .

class PersonController {
	final PersonService personService
	def PersonController( PersonService personService ){
		this.personService = personService
	Page<Person> list( Pageable pageable){
		Page<Person> persons = personService.listAllByPage(pageable)

Notice that we haven’t passed RequestParams to our handler method . When the endpoint /persons?page=0&size=3 is hit, Spring would automatically resolve the page and size parameters and create a Pageable instance . We would then pass this Pageable instance to the Service layer ,which would pass it to our Repository layer .

Next,we create a PersonRepository class to interact with the database.

interface PersonRepository extends PagingAndSortingRepository<Person,Integer> {


The PersonRepository class is just an interface. This might be weird for those coming from traditional Spring MVC world wherein you had to write implementation classes , and interacted with the database using Hibernate. Well, you don’t need to do that anymore. The PagingAndSortingRepository extends the CrudRepository , thereby adding Paging capabilities .

Now all we need to do is to create a PersonService interface and PersonServiceImpl to expose the repository.

interface PersonService {
	Page<Person> listAllByPage(Pageable pageable)
class PersonServiceImpl implements PersonService {

	final PersonRepository personRepository
	def PersonServiceImpl(PersonRepository personRepository){
		this.personRepository = personRepository
	 Page<Person> listAllByPage(Pageable pageable) {

This is all, really ! Let’s test it out . I created a test class to insert a batch of 20 Person objects . You can do this manually ofcourse.

@SpringApplicationConfiguration(classes = SampleBootPaginationApplication)
class SampleBootPaginationApplicationTests {
	PersonRepository personRepository
	void contextLoads() { 
		def person 
			person = new Person(name:"John $it", age : 22)

Great,we’re all done . Let’s hit the endpoint with Postman .


The snapshot doesn’t display the entire JSON. So here it is .

  "content": [
      "id": 1,
      "name": "John 1",
      "age": 22
      "id": 2,
      "name": "John 2",
      "age": 22
      "id": 3,
      "name": "John 3",
      "age": 22
  "last": false,
  "totalElements": 20,
  "totalPages": 7,
  "size": 3,
  "number": 0,
  "sort": null,
  "first": true,
  "numberOfElements": 3

You can download the sample here