Как сделать нумерацию страниц в REST-сервисе? - PullRequest
2 голосов
/ 26 мая 2019

Мне нужно написать какой-нибудь REST-сервис, который должен обрабатывать миллион записей и возвращать ответ пользователю в формате JSON. Я пишу REST-контроллер с помощью Spring и делаю пагинацию.

public List<ContactDto> getAllContacts() {

        double countItems = contactRepo.count();
        int pages = (int) Math.ceil(countItems / totalItemsPerPage);

        List<Contact> contacts = new ArrayList<>();
        for (int i = 0; i < pages; i++) {
            Page<Contact> page = contactRepo.findAll(PageRequest.of(i, totalItemsPerPage));
            contacts.addAll(page.stream().collect(Collectors.toList()));
        }

        return contacts.stream()
                .map(entity -> new ContactDto(entity.getId(), entity.getName()))
                .collect(Collectors.toList());
    }

Я новичок весной и нумерацией страниц.

В этом подходе есть смысл или я что-то не так делаю?

Я имею в виду, я хочу знать, я использую запись нумерации страниц или неправильно?

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 26 мая 2019

Кажется, что вы собираете все контакты со всех страниц, и это не имеет смысла, поскольку вы храните все данные в памяти, сводя на нет все преимущества отложенной загрузки.

Я бы предложил следующее:

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, если это необходимо.

0 голосов
/ 26 мая 2019

Вы должны взглянуть на Spring Data Rest .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...