#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-фильтра, который выполняет
- Считывает результат
PersonController
- Если
expands
параметр находится в строке запроса, он должен разрешить шаблон uriaddresses
подресурса - с помощью шаблона uri он должен указать Micronaut разрешить соответствующий метод компонента контроллера.
- вызовите метод и объедините person и адреса в теле ответа
В нем была предпринята попытка реализовать некоторые из фильтров, как вы можете видеть ниже.
Теперь мои вопросы таковы:
- Есть ли способ в Micronaut разрешить компонент контроллера и метод с помощью
UriTemplate
и aHttpMethod
? - Как я могу вызвать этот метод?
Псевдо-реализация
@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 и был бы рад, если бы кто-нибудь из вас мог дать мне подсказки о том, как я мог бы реализовать эту функцию. Спасибо.