2014-12-05 43 views
0

我有一個簡單的JAX-RS應用程序,用Jersey 2.13編寫,我使用通過UriInfo派生出的UriBuilder通過@Context註釋來發出「鏈接」。如何在@Context之外獲得AbsolutePathBuilder()

@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

您可以使用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」傳遞給類(理想情況下作爲服務方法調用的一部分),如果該信息是真正需要的類。如上所示,從環境中提取事物通常會導致在新人們不瞭解代碼的工作原理時,很難發現錯誤。

+0

「...... IMO的最佳做法是將」absolutePathBuilder「傳遞給類...」我開始看到這種智慧。 @Provider並不能真正幫助我解決問題,我認爲「我的問題」實際上是問題所在。 – 2014-12-05 22:29:11

相關問題