Я работаю над 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);
}
Как можно это структурировать, чтобы предотвратить такую утечку?
Есть идеи?