如何在@Context之外获取AbsolutePathBuilder()

时间:2014-12-05 18:56:31

标签: jersey jax-rs

我有一个简单的JAX-RS应用程序,用Jersey 2.13编写,我用它来发出“链接”,使用通过@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()?

1 个答案:

答案 0 :(得分: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);

    }
}

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

这回答了你的问题,但如果我没有指出IMO的最佳做法是通过" absolutePathBuilder"我会疏忽。如果类真正需要该信息,则进入类(理想情况下作为服务方法调用的一部分)。如上所示,将环境中的东西从环境中拉出来往往会导致很难找到错误,因为当新人不知道代码是如何工作的时候。