我有一个简单的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()?
答案 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"我会疏忽。如果类真正需要该信息,则进入类(理想情况下作为服务方法调用的一部分)。如上所示,将环境中的东西从环境中拉出来往往会导致很难找到错误,因为当新人不知道代码是如何工作的时候。