如何通过URI模板和HttpMethod解决Micronaut Controller方法?

时间:2019-03-29 13:28:41

标签: java micronaut

我对Micronaut和REST API有疑问。首先让我解释一下我的情况以及我要实现的目标。

我们假设有两个REST资源personaddressaddressperson资源的子资源,因此URI路径如下。

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

对于我们的REST客户端,我想提供一个我称为“ Expanded Gets” 的功能,类似于SQL中的表联接。

没有 “扩展获取” ,客户​​端必须执行至少两个HTTP调用才能读取一个人及其地址。

  • /persons/123-阅读该人
  • /persons/123/addresses/-读取该人的所有地址

通过 “扩展获取” ,客户​​只能在一个请求中读取此人及其地址。

  • /persons/123?expands=(addresses)

到目前为止,简介部分。

为了在Micronaut中实现此目的,我正在考虑注册一个执行此操作的HTTP过滤器

  1. 读取PersonController
  2. 的结果
  3. 如果expands参数在查询字符串中,则它应解析addresses子资源的uri模板
  4. 使用uri模板,它应该告诉Micronaut解决相应的controller bean方法。
  5. 调用方法并将人员和地址组合在响应正文中

它试图实现一些过滤器,如下所示。

我的问题是:

  • Micronaut中是否可以通过UriTemplateHttpMethod来解析控制器bean和方法?
  • 如何调用此方法?

伪实现

@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的新手,如果任何人都可以向我提示如何实现该功能,我将感到非常高兴。谢谢。

0 个答案:

没有答案