【问题标题】:How do I getAbsolutePathBuilder() outside of @Context如何在@Context 之外获取AbsolutePathBuilder()
【发布时间】:2014-12-05 18:56:30
【问题描述】:

我有一个用 Jersey 2.13 编写的简单 JAX-RS 应用程序,我用它来使用通过 @Context 注释注入的 UriInfo 派生的 UriBuilder 发出“链接”。

@Context
private UriInfo uriInfo;
...
UriBuilder uriBuilder = uriInfo.getAbsolutePathBuilder();
String prId = UUID.randomUUID().toString();
URI prURI = uriBuilder.path(prId).build();
...
builder.putLink(new Link("self", prURI.toString()));

我发现在我的一些支持类中,我需要一种从 uriInfo.getAbsolutePathBuilder() 派生的 UriBuilder 的方法,而无需使用 @Context 注释。我该怎么做呢?有什么办法可以直接向资源询问建造者吗?静态询问,为构建器扩展 ResourceConfig 的类是什么?

如何在 @Context 之外获取 getAbsolutePathBuilder()?

【问题讨论】:

    标签: jersey jax-rs


    【解决方案1】:

    您可以使用 ContainerRequestFilter 在过滤器中捕获请求,然后将 uriInfo 对象放入线程局部变量中。下面是一个可能的解决方案,但不是 100% 完成,因为我没有提供需要保存 uriInfo 对象的线程本地实例的 UriInfoHolder 类。要了解如何执行此操作,可以查看 spring 的 LocaleContextHolder 类作为示例。

    @Provider
    public class MyFilter implements ContainerRequestFilter {
    
        @Override
        public void filter(ContainerRequestContext requestContext)
                throws IOException {
    
            UriInfo uriInfo = requestContext.getUriInfo();
            if (uriInfo != null)
                UriInfoHolder.setUriInfo(uriInfo);
    
        }
    }
    

    然后在资源调用的线程上的任何其他类中,您可以通过调用方法UriInfoHolder.getUriInfo() 来获取uriInfo(以及absolutePathBuilder)。请参阅并行的LocaleContextHolder.getLocale() 方法以获取灵感。

    这回答了您的问题,但如果我没有指出 IMO 的最佳做法是将“absolutePathBuilder”传递给类(最好是作为服务方法调用的一部分),如果该信息是真的班级所需要的。正如我上面展示的那样,从环境中提取东西通常会导致当新人不了解代码的工作原理时,很难在多年后发现错误。

    【讨论】:

    • "...IMO 的最佳实践是将“absolutePathBuilder”传递给类..."我开始看到这个的智慧。 @Provider 这件事并没有真正帮助我解决问题,我认为“我的问题”实际上是问题所在。
    猜你喜欢
    • 2018-09-26
    • 1970-01-01
    • 2020-09-25
    • 2021-09-23
    • 2017-11-09
    • 2019-07-20
    • 2021-08-05
    • 2016-08-01
    • 1970-01-01
    相关资源
    最近更新 更多