Разбивка на страницы с помощью Spring-Data: PageRequest просачивается в контроллер REST - PullRequest
0 голосов
/ 28 марта 2019

Я работаю над REST API на основе Spring-Boot с базой данных MongoDB. Приложение использует подход Controller> Service> Repository. В настоящее время я работаю над внедрением разбитой на страницы конечной точки:

/api/clients?range={offset}-{limit}

eg. /api/clients?range=0-25 (retrieves entities 0-24)

Моя проблема в том, что для построения ответа «Диапазон содержимого» и для различения между 200 «ОК» и 206 «Частичное содержимое» ответами (в зависимости от того, получает ли запрос все объекты или нет), я необходимо получить информацию, такую ​​как общее количество объектов из объекта Page. Поэтому я создаю PageRequest в контроллере, который передается в службу и через репозиторий. Я получаю что-то вроде этого:

@ResponseBody
@GetMapping(params = { "range" })
public ResponseEntity<?> getAllClients(
        final @RequestParam(value = "range", required = false) QueryRange queryRange,
        final HttpServletResponse response) {

    response.addHeader(HttpHeaders.ACCEPT_RANGES, "client " + MAX_CLIENTS);

    if (queryRange.getCount() > MAX_CLIENTS) {
        throw new ForbiddenRangeException("client", MAX_CLIENTS);
    }

    Integer offset = queryRange.getOffset();
    Integer limit = queryRange.getLimit();

    Integer count = limit - offset;
    Integer page = offset != 0 ? offset / count : 0;

    PageRequest request = PageRequest.of(page, count);

    final Page<Client> clients = clientService.getAllClients(request);

    final HttpStatus status = (queryRange.getOffset() == 0 && clients.isLast())
            ? HttpStatus.OK
            : HttpStatus.PARTIAL_CONTENT;

    final String contentRange = String.format("%d-%d/%d",
            queryRange.getOffset(),
            queryRange.getOffset() + clients.getContent().size() - 1,
                clients.getTotalElements());

    response.addHeader(HttpHeaders.CONTENT_RANGE, contentRange);

    return new ResponseEntity<>(clients, status);
}

Как можно это структурировать, чтобы предотвратить такую ​​утечку?

Есть идеи?

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