Dentro de AvistamentoController temos:

image.png

@RestController
@RequestMapping("/avistamento")
@RequiredArgsConstructor
@Getter
public class AvistamentoController {
    private final AvistamentoRepository repository;

    // A paginação é iniciada na página 0 a cada 5 página - o total de páginas é o size
    @GetMapping("/paginado")
    public ResponseEntity<List<Avistamento>> ListarTodosPaginado(
            @RequestHeader(value = "X-Page", required = false, defaultValue = "0") int page,
            @RequestHeader(value = "X-Size", required = false, defaultValue = "5") int size) {
        // 1-10 de 2000
        // 11-20 de 2000
        // 1991-2000 de 2000

        // Armazena todos os itens
        List<Avistamento> avistamentos = repository.listarTodos();
        int fromIndex = page * size;        // 0 * 5
        int toIndex = Math.min(fromIndex + size, avistamentos.size()); // Obtém até a próximia pagianção
        // Caso o index seja maior que o tamanho da base retorna sem conteúdso
        if (fromIndex > avistamentos.size()) {
            return ResponseEntity.noContent().build();
        }
        // Lista todas as páginas do índice atual até o próximo índice
        List<Avistamento> pagina = avistamentos.subList(fromIndex, toIndex);
        // Calcula o total de páginas arredondando paar baixo
        int totalPages = (int) Math.ceil((double) avistamentos.size() / size);
        return ResponseEntity.ok()
                .header("X-Total-Count", String.valueOf(avistamentos.size()))
                .header("X-Total-Pages", String.valueOf(totalPages))
                .header("X-Total-Count", String.valueOf(totalPages))
                .body(pagina);
    }