Как можно разрешить метод контроллера Micronaut с помощью шаблона URI и HttpMethod? - PullRequest
1 голос
/ 29 марта 2019

У меня вопрос по API Micronaut и REST.Позвольте мне сначала объяснить мой случай и то, что я пытаюсь достичь.

Давайте представим, что есть два ресурса REST person и address.address является подресурсом ресурса person, поэтому путь URI будет следующим:

/persons/{person-id}/addresses/{address-id}

Для наших клиентов REST я хотел бы предоставить функцию, которую я вызываю «Расширенные получения» аналогично объединению таблиц в SQL.

Без «Расширенные получения» клиент должен выполнить как минимум два HTTP-вызовачитать человека и его адреса.

  • /persons/123 - читать человека
  • /persons/123/addresses/ - читать все адреса этого человека

С помощью «Расширенное получение» клиент может прочитать человека и его адреса только в одном запросе.

  • /persons/123?expands=(addresses)

Пока вступительная часть.

Чтобы реализовать это в Micronaut, я думал о регистрации HTTP-фильтра, который

  1. считывает результат PersonController
  2. Если expands параметр находится в строке запроса, он должен разрешать шаблон uri addresses подресурса
  3. с шаблоном uri, который должен указывать Micronaut для разрешения соответствующего метода bean-компонента контроллера.
  4. вызывать методи объедините человека и адреса в теле ответа

Он попытался реализовать некоторые фильтры, как вы можете видеть ниже.

Мои вопросы сейчас:

  • Есть ли в Micronaut способ разрешить компонент управления и метод с помощью UriTemplate и HttpMethod?
  • Как я могу вызвать этот метод?

Псевдо-реализация

@Filter("/v1/**")
public class HateoasFilter implements HttpServerFilter {


  @Override
  public Publisher<MutableHttpResponse<?>> doFilter(
    HttpRequest<?> request, ServerFilterChain chain) {
    return Flowable.fromPublisher(chain.proceed(request)).doOnNext((res) -> {

      // if the request contains a expands parameter in the querystring
      if (!request.getParameters().getAll("expands").isEmpty()) {

        // get the person
        Person person = res.body();

        String expands = request.getParameters().getFirst("expands").get();

        // lookup the uri path. address => /person/{personId}/addresses/. This is part of the application and not Micronaut.
        String uriPathForSubresource = subresourceRegistry.lookup("addresses");

        UriTemplate subresourceUriTemplate = UriTemplate.of(uriPathForSubresource);

        // how can I lookup the controller bean and GET method for a uri template?
        Method m = micronaut.lookupMethod(subresourceUriTemplate, HttpMethod.GET);

        // invoke the controller method and the the addresses
        List<Address> addresses = m.invoke(....);

        // put em to the body
        res.body(new PersonAddresses(person, addresses))
      }

    });
  }
}

Я новичок в Micronaut и буду рад, если кто-нибудь из вас подскажет, как я могу реализовать эту функцию.Спасибо.

...