繁体   English   中英

拦截时从 ClientRequestContext/ClientRequestFilter/similar 获取 JAX-RS (Resteasy) @Path 注释值

[英]Get JAX-RS (Resteasy) @Path annotation value from ClientRequestContext/ClientRequestFilter/similar when intercepted

问题:我们如何从 JAX-RS 拦截器/过滤器获取代理资源接口的 @Path 值?

详细信息:当 HTTP 请求通过使用 JAX-RS 的服务时,它使用带注释的 Resource java 接口进行匹配

public interface UserClient
{
    @GET
    @Path("/user/{id}")
    User getUser(@PathParam("id") UUID id);
}

JAX-RS 中还有一个拦截器和过滤器的责任链模式。 目前,我们使用过滤器 (ClientRequestFilter) 来记录我们的服务内跟踪平台中的网络调用。

我们有机会给我们的跟踪一个显示名称,这是由跟踪平台分组/索引的。 我想使用 rest 端点作为名称,但是如果使用 @Path 变量,这将成为 URI 的一部分,因此您的 ID(在上面的示例中)也被包含在内,因此而不是您的跟踪平台分组调用像/user/{userId}和一个名字一样,你最终会有很多名字/user/1/user/2/user/n

JAX-RS 框架中是否有任何部分可以拦截 http 调用,并且可以访问与该 http 调用匹配的资源代理接口? 或者其他一些方法来确定 http 调用匹配的模式?

经过一些不同的方法后,以下似乎有效。 我无法在所有情况下确认它的可靠性,但到目前为止它可以完成工作。

Optional.of(clientRequestContext)
                .filter(ClientRequestContextImpl.class::isInstance)
                .map(ClientRequestContextImpl.class::cast)
                .map(ClientRequestContextImpl::getInvocation)
                .map(ClientInvocation::getClientInvoker)
                .map(ClientInvoker::getMethod)
                .map(method -> method.getAnnotation(Path.class))
                .map(Path::value)
                .orElseThrow();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM