Как я могу разрешить метод контроллера Micronaut с помощью шаблона URI и HttpMethod?

#java #micronaut

#java #micronaut

Вопрос:

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

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

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

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

«Расширенный Gets» Без того, чтобы клиент выполнил по крайней мере два HTTP-вызова, чтобы прочитать person и его адреса.

  • /persons/123 — чтобы прочитать person
  • /persons/123/addresses/ — для чтения всех адресов этого пользователя

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

  • /persons/123?expands=(addresses)

Пока вводная часть.

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

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

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

Теперь мои вопросы таковы:

  • Есть ли способ в Micronaut разрешить компонент контроллера и метод с помощью UriTemplate и a 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 и был бы рад, если бы кто-нибудь из вас мог дать мне подсказки о том, как я мог бы реализовать эту функцию. Спасибо.