Spring Pageable сортировка выставляет внутреннее именование дао - PullRequest
0 голосов
/ 02 января 2019

Я строю остальные микросервисы с помощью Spring и Spring Repositories.Я хочу дать клиенту контроль над поиском и сортировкой (используя spring-data-rest).

public PagedResources<TestDto> find(
    @PageableDefault(page = 0, size = 50) final Pageable pageable,
    final PagedResourcesAssembler<Test> assembler) {

    final Page<Test> pagedResults = testRepository.findAll(pageable);

    return assembler.toResource(pagedResults, testResourceAssembler);
}

Код выше работает отлично, за исключением того, что я не рад, что сортировка связана с моим даослоем вместоDTO-слой.Пример:

http://localhost:8080/my-service/test?size=100&page=0&sort=statusCode,asc

json response (DTO):

{
  "links": [
    ...
    ...
  ],
  "content": [
    {
      "id": 4
      "status": "OK"
      "links": []
    }
  ],
  "page": {
    "size": 100,
    "totalElements": 1,
    "totalPages": 1,
    "number": 0
  }
}

заметить разницу между сортировкой «statusCode» в URL запроса и соответствующим «состоянием» в ответе dto.С точки зрения клиента это не логично.Теперь я также раскрыл некоторую внутреннюю информацию сервиса.Я не могу изменить реализацию службы, потому что она может использоваться клиентом и сломает старый запрос после изменения имени.

Когда я добавляю пользовательское сопоставление для обработки разницы statuscode и status в поисковом запросе:

private PageRequest getPageRequest(final Pageable pageable) {
    final List<Order> newOrder = new ArrayList<>();
    for (final Order order : pageable.getSort()) {
    if (daoToJpaMapping.containsKey(order.getProperty())) {
            newOrder.add(new Order(order.getDirection(), daoToJpaMapping.get(order.getProperty())));
        } else {
            throw new OngeldigSortProperty(order.getProperty() + " is niet toegestaan als sorteerproperty");
        }
    }
    final PageRequest pageRequest = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), Sort.by(newOrder));

    return pageRequest;
}

это имеет неприятные последствия для меня с ответом hal, потому что он содержит полный URL, основанный на именах jpa:

{
  "links": [
    {
      "rel": "first",
      "href": "http://localhost:8080/my-service/test?page=0&size=100&sort=statusCode,asc",
...

Я не мог найти способ решить эту проблему, кроменастраиваемый параметр сортировки, страницы и размера.Но создание пользовательского атрибута сортировки, который работает так же хорошо, как и в весенней версии, похоже на то, чтобы снова изобрести колесо.Означает ли это, что я пытаюсь злоупотреблять весенними функциями?Работа с DTO довольно распространена, поэтому я был удивлен, что никакой (весенний) учебник, объясняющий подкачку в вашем интерфейсе отдыха, не освещает эту часть.Есть ли решение?

...