Java 如何通过URI模板和HttpMethod解析Micronaut控制器方法?

Java 如何通过URI模板和HttpMethod解析Micronaut控制器方法?,java,micronaut,Java,Micronaut,我有一个关于Micronaut和RESTAPI的问题。让我先解释一下我的情况和我正在努力实现的目标 让我们假设有两个REST资源person和addressaddress是person资源的子资源,因此URI路径如下所示 /persons/{personid}/address/{address id} 对于我们的REST客户机,我想提供一个我称之为“Expanded Gets”的特性,类似于SQL中的表联接 如果没有“Expanded Gets”,客户端必须执行至少两个HTTP调用才能读取一个人

我有一个关于Micronaut和RESTAPI的问题。让我先解释一下我的情况和我正在努力实现的目标

让我们假设有两个REST资源
person
address
address
person
资源的子资源,因此URI路径如下所示

/persons/{personid}/address/{address id}

对于我们的REST客户机,我想提供一个我称之为“Expanded Gets”的特性,类似于SQL中的表联接

如果没有“Expanded Gets”,客户端必须执行至少两个HTTP调用才能读取一个人及其地址

  • /persons/123
    -阅读人物
  • /persons/123/addresses/
    -读取此人的所有地址
使用“Expanded Gets”,客户端只需一次请求即可读取此人及其地址

  • /persons/123?扩展=(地址)
到目前为止,介绍部分

为了在Micronaut中实现这一点,我考虑注册一个HTTP过滤器,它可以

  • 读取
    PersonController的结果
  • 如果
    展开
    参数位于查询字符串中,则应解析
    地址
    子资源的uri模板
  • 通过uri模板,它应该告诉Micronaut解析相应的控制器bean方法
  • 调用该方法并在响应体中组合person和addresses
  • 它试图实现一些过滤器,如下面所示

    我现在的问题是:

    • Micronaut中是否有一种方法可以通过
      UriTemplate
      HttpMethod
      解析控制器bean和方法
    • 如何调用此方法

    伪实现

    @过滤器(“/v1/**”)
    公共类HateoasFilter实现HttpServerFilter{
    @凌驾
    公共出版商
    
    @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))
          }
    
        });
      }
    }