Java 如何通过URI模板和HttpMethod解析Micronaut控制器方法?
我有一个关于Micronaut和RESTAPI的问题。让我先解释一下我的情况和我正在努力实现的目标 让我们假设有两个REST资源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调用才能读取一个人
person
和address
address
是person
资源的子资源,因此URI路径如下所示
/persons/{personid}/address/{address id}
对于我们的REST客户机,我想提供一个我称之为“Expanded Gets”的特性,类似于SQL中的表联接
如果没有“Expanded Gets”,客户端必须执行至少两个HTTP调用才能读取一个人及其地址
-阅读人物/persons/123
-读取此人的所有地址/persons/123/addresses/
/persons/123?扩展=(地址)
PersonController的结果
展开
参数位于查询字符串中,则应解析地址
子资源的uri模板- Micronaut中是否有一种方法可以通过
和UriTemplate
解析控制器bean和方法HttpMethod
- 如何调用此方法
伪实现
@过滤器(“/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))
}
});
}
}