Кажется, что вы собираете все контакты со всех страниц, и это не имеет смысла, поскольку вы храните все данные в памяти, сводя на нет все преимущества отложенной загрузки.
Я бы предложил следующее:
1.Rest контроллер должен иметь возможность принимать аргументы pageNumber и pageSize:
@GetMapping(value="/uri/{pageNumber}/{pageSize}")
public List<Contact> getContactsPage(@PathVariable("pageNumber") final Integer pageNumber, @PathVariable("pageSize") final Integer pageSize) {
//service or repository call
}
2. Интерфейс репозитория должен расширять PagingAndSortingRepository:
public interface ContactRepository extends PagingAndSortingRepository<Contact, Long> {
Page<Contact> fingAll(Pageable pageable);
}
3.В вашей службе или в контроллере непосредственно создайте объект Pageable и передайте его в качестве аргумента ContactRepository # fingAll ():
final Pageable contactsPageable = PageRequest.of(pageNumber, pageSize);
4.Map Page в DTO, если это необходимо.