Spring Framework Tutorial

Software Setup and Configuration (STS/Eclipse/IntelliJ)

Core Spring

Spring Annotations

Spring Data

Spring JDBC

Spring Security

Spring - REST Pagination

In a RESTful service, pagination is essential when dealing with large datasets. Pagination helps ensure that only a subset of data is transferred over the network, reducing both load times and server resource consumption.

Spring Data and Spring Boot make pagination and sorting quite easy. Below are the steps to set up a basic pagination in a Spring Boot REST service:

1. Set up Spring Boot Project:

You can use Spring Initializr to bootstrap your project.

2. Define an Entity:

Suppose you have a Person entity.

@Entity
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private int age;
    // getters, setters, etc.
}

3. Set up a Repository:

Spring Data JPA's PagingAndSortingRepository provides methods to retrieve entities with pagination and sorting capabilities:

public interface PersonRepository extends PagingAndSortingRepository<Person, Long> {
}

4. Create a Service:

@Service
public class PersonService {

    @Autowired
    private PersonRepository personRepository;

    public Page<Person> findAll(Pageable pageable) {
        return personRepository.findAll(pageable);
    }
}

5. REST Controller:

@RestController
@RequestMapping("/persons")
public class PersonController {

    @Autowired
    private PersonService personService;

    @GetMapping
    public ResponseEntity<Page<Person>> getAllPersons(
            @RequestParam(required = false, defaultValue = "0") int page,
            @RequestParam(required = false, defaultValue = "10") int size,
            @RequestParam(required = false, defaultValue = "id") String sort) {

        Pageable pageable = PageRequest.of(page, size, Sort.by(sort));
        Page<Person> persons = personService.findAll(pageable);
        return new ResponseEntity<>(persons, HttpStatus.OK);
    }
}

Usage:

When querying your REST endpoint, you can specify pagination parameters:

  • page: The page number (0-indexed).
  • size: The number of records per page.
  • sort: The sorting criteria, based on entity properties.

Example:

GET /persons?page=0&size=5&sort=name

This fetches the first five Person entities sorted by name.

Frontend Pagination:

For frontend applications consuming this service, the Page object in the response contains information about the total number of records, total pages, the current page, etc. This information can be used to create pagination controls in the frontend application.

  1. Pagination in Spring Boot REST API:

    • Description: Pagination in a Spring Boot REST API involves breaking large sets of data into smaller chunks, improving performance and resource utilization.

    • Code Example:

      @GetMapping("/employees")
      public ResponseEntity<List<Employee>> getEmployees(
              @RequestParam(defaultValue = "0") int page,
              @RequestParam(defaultValue = "10") int size) {
          Page<Employee> employeePage = employeeService.getEmployees(PageRequest.of(page, size));
          return new ResponseEntity<>(employeePage.getContent(), HttpStatus.OK);
      }
      
  2. Spring Data JPA pagination example:

    • Description: Spring Data JPA provides built-in support for pagination using Page and Pageable.

    • Code Example:

      public interface EmployeeRepository extends JpaRepository<Employee, Long> {
          Page<Employee> findAll(Pageable pageable);
      }
      
  3. Implementing pagination in Spring REST services:

    • Description: Implementing pagination in Spring REST services involves using Page and Pageable in service methods.

    • Code Example:

      public class EmployeeServiceImpl implements EmployeeService {
          @Override
          public Page<Employee> getEmployees(Pageable pageable) {
              return employeeRepository.findAll(pageable);
          }
      }
      
  4. Spring Boot pagination and sorting example:

    • Description: Combine pagination and sorting in a Spring Boot REST API to retrieve paginated and sorted data.

    • Code Example:

      @GetMapping("/employees")
      public ResponseEntity<Page<Employee>> getEmployees(
              @RequestParam(defaultValue = "0") int page,
              @RequestParam(defaultValue = "10") int size,
              @RequestParam(defaultValue = "id,asc") String[] sort) {
          Page<Employee> employeePage = employeeService.getEmployees(PageRequest.of(page, size, Sort.by(sort)));
          return new ResponseEntity<>(employeePage, HttpStatus.OK);
      }
      
  5. RESTful pagination with Spring HATEOAS:

    • Description: Apply HATEOAS principles to build RESTful APIs with paginated responses.

    • Code Example:

      @GetMapping("/employees")
      public ResponseEntity<PagedModel<EntityModel<Employee>>> getEmployees(
              @RequestParam(defaultValue = "0") int page,
              @RequestParam(defaultValue = "10") int size) {
          Page<Employee> employeePage = employeeService.getEmployees(PageRequest.of(page, size));
          PagedModel<EntityModel<Employee>> pagedModel = assembler.toModel(employeePage);
          return new ResponseEntity<>(pagedModel, HttpStatus.OK);
      }
      
  6. Spring Data REST pagination:

    • Description: Spring Data REST automatically provides pagination for repository endpoints.

    • Code Example:

      // No additional code needed in the controller; Spring Data REST handles pagination automatically.
      
  7. Custom pagination in Spring REST:

    • Description: Implement custom pagination logic when the default Spring Data pagination is not sufficient.

    • Code Example:

      public interface CustomEmployeeRepository {
          List<Employee> findCustomPaginatedEmployees(int offset, int limit);
      }
      
  8. Spring Data JPA pagination and filtering:

    • Description: Implement pagination and filtering together using Spring Data JPA.

    • Code Example:

      public interface EmployeeRepository extends JpaRepository<Employee, Long> {
          Page<Employee> findByDepartmentAndSalary(String department, double salary, Pageable pageable);
      }
      
  9. Paginating API responses in Spring Boot:

    • Description: Paginate API responses to limit the amount of data returned in each request.

    • Code Example:

      @GetMapping("/employees")
      public ResponseEntity<List<Employee>> getEmployees(
              @RequestParam(defaultValue = "0") int page,
              @RequestParam(defaultValue = "10") int size) {
          Page<Employee> employeePage = employeeService.getEmployees(PageRequest.of(page, size));
          return new ResponseEntity<>(employeePage.getContent(), HttpStatus.OK);
      }
      
  10. Spring REST API page size and offset:

    • Description: Allow clients to specify page size and offset for paginated requests in a Spring REST API.

    • Code Example:

      @GetMapping("/employees")
      public ResponseEntity<Page<Employee>> getEmployees(
              @RequestParam(defaultValue = "0") int page,
              @RequestParam(defaultValue = "10") int size) {
          Page<Employee> employeePage = employeeService.getEmployees(PageRequest.of(page, size));
          return new ResponseEntity<>(employeePage, HttpStatus.OK);
      }
      
  11. Pagination parameters in Spring REST:

    • Description: Define and use pagination parameters like page and size in Spring REST API requests.

    • Code Example:

      @GetMapping("/employees")
      public ResponseEntity<Page<Employee>> getEmployees(
              @RequestParam(defaultValue = "0") int page,
              @RequestParam(defaultValue = "10") int size) {
          Page<Employee> employeePage = employeeService.getEmployees(PageRequest.of(page, size));
          return new ResponseEntity<>(employeePage, HttpStatus.OK);
      }
      
  12. Paging and sorting in Spring Boot RESTful API:

    • Description: Combine paging and sorting for more flexible querying in a Spring Boot RESTful API.

    • Code Example:

      @GetMapping("/employees")
      public ResponseEntity<Page<Employee>> getEmployees(
              @RequestParam(defaultValue = "0") int page,
              @RequestParam(defaultValue = "10") int size,
              @RequestParam(defaultValue = "id,asc") String[] sort) {
          Page<Employee> employeePage = employeeService.getEmployees(PageRequest.of(page, size, Sort.by(sort)));
          return new ResponseEntity<>(employeePage, HttpStatus.OK);
      }
      
  13. Spring Boot REST API pagination with Thymeleaf:

    • Description: Integrate Thymeleaf with Spring Boot REST API to handle paginated responses.

    • Code Example:

      @GetMapping("/employees")
      public String getEmployees(
              @RequestParam(defaultValue = "0") int page,
              @RequestParam(defaultValue = "10") int size,
              Model model) {
          Page<Employee> employeePage = employeeService.getEmployees(PageRequest.of(page, size));
          model.addAttribute("employees", employeePage.getContent());
          model.addAttribute("currentPage", employeePage.getNumber());
          model.addAttribute("totalPages", employeePage.getTotalPages());
          return "employees";
      }
      
  14. Handling large datasets with pagination in Spring:

    • Description: Employ pagination to handle large datasets efficiently in a Spring REST API.

    • Code Example:

      @GetMapping("/employees")
      public ResponseEntity<Page<Employee>> getEmployees(
              @RequestParam(defaultValue = "0") int page,
              @RequestParam(defaultValue = "10") int size) {
          Page<Employee> employeePage = employeeService.getEmployees(PageRequest.of(page, size));
          return new ResponseEntity<>(employeePage, HttpStatus.OK);
      }
      
  15. Spring HATEOAS pagination example:

    • Description: Use Spring HATEOAS to add hypermedia links to paginated resources.

    • Code Example:

      @GetMapping("/employees")
      public ResponseEntity<PagedModel<EntityModel<Employee>>> getEmployees(
              @RequestParam(defaultValue = "0") int page,
              @RequestParam(defaultValue = "10") int size) {
          Page<Employee> employeePage = employeeService.getEmployees(PageRequest.of(page, size));
          PagedModel<EntityModel<Employee>> pagedModel = assembler.toModel(employeePage);
          return new ResponseEntity<>(pagedModel, HttpStatus.OK);
      }
      
  16. RESTful API design with pagination in Spring:

    • Description: Design RESTful APIs with pagination to improve client experience and server efficiency.

    • Code Example:

      @GetMapping("/employees")
      public ResponseEntity<Page<Employee>> getEmployees(
              @RequestParam(defaultValue = "0") int page,
              @RequestParam(defaultValue = "10") int size) {
          Page<Employee> employeePage = employeeService.getEmployees(PageRequest.of(page, size));
          return new ResponseEntity<>(employeePage, HttpStatus.OK);
      }
      
  17. Spring Data JPA pageable example:

    • Description: Spring Data JPA provides a Pageable interface for paginating queries.

    • Code Example:

      public interface EmployeeRepository extends JpaRepository<Employee, Long> {
          Page<Employee> findAll(Pageable pageable);
      }