2012-06-05 54 views
12

我一直在到處尋找,但似乎無法找到一個明確的答案......哪裏@Context對象來自

什麼機制,使一臺服務器(GlassFish的我的問題)注入實際OBJETS是用@Context註釋?更具體地說,如果我想寫一個類似做類似的事情:

@Path("/") 
public class MyResource { 
    @GET 
    public String doSomething(@Context MyObject obj) { 
    // ... 
    } 
} 

那麼我該怎麼做呢? MyObject的實例在哪裏?誰在做什麼?如何?

編輯:我見過的東西,如下列:

Using @Context, @Provider and ContextResolver in JAX-RS

http://jersey.576304.n2.nabble.com/ContextResolver-confusion-td5654154.html

然而,這不符合我所看到的廣場,如在org.neo4j.server.rest.web.RestfulGraphDatabase的構造,它具有以下特徵:

public RestfulGraphDatabase(
    @Context UriInfo uriInfo, 
    @Context Database database, 
    @Context InputFormat input, 
    @Context OutputFormat output, 
    @Context LeaseManager leaseManager) 

回答

7

您可以編寫自己的注射供應商,把它插入到澤西 - 看SingletonTypeInjectableProviderPerRequestTypeInjectableProvider - 擴展這些類(這取決於你想要的注射對象的生命週期)中的一個,並註冊您的實現作爲提供商在您的網絡應用程序

例如,這樣的事情:

@Provider 
public class MyObjectProvider extends SingletonTypeInjectableProvider<Context, MyObject> { 
    public MyObjectProvider() { 
     // binds MyObject.class to a single MyObject instance 
     // i.e. the instance of MyObject created bellow will be injected if you use 
     // @Context MyObject myObject 
     super(MyObject.class, new MyObject()); 
    } 
} 

爲了在你的web應用程序提供者,你有幾種選擇:

  1. 如果您的應用程序使用的類路徑掃描(或包掃描)只是讓確定提供者是在正確的包中/類路徑
  2. 或者你可以簡單地使用META-INF /服務條目註冊它(添加META-INF/services/com.sun.jersey.spi.inject.InjectableProvider文件你提供的名字呃類的內容)
+0

如果你是子類化javax.ws.rs.core.Application,你可以在你的應用程序的構造函數中用'this.getSingletons()。add(new MyObjectProvider());'註冊提供者。 – justin

+0

鏈接已損壞。 –

+0

試試這些:https://jersey.java.net/nonav/apidocs/1.19/jersey/com/sun/jersey/spi/inject/SingletonTypeInjectableProvider.html https://jersey.java.net/nonav/apidocs /1.19/jersey/com/sun/jersey/spi/inject/PerRequestTypeInjectableProvider.html – elanh

-1

chapters 5-6 of the JAX-RS spec。這應該告訴你你需要知道的一切。

+0

請問這些文件說怎麼寫這樣functionallity自己嗎?我的理解是這個問題。 –

+0

你不知道。它適用於框架組件。如果您需要依賴注入,請查找DI容器,如Spring。 –

+0

由於鏈接的網站的內容可能會更改,是不是隻有鏈接的答案不被接受? – smcg

0

我不認爲你可以使用@Context與用戶定義的類型,如MyObject。它用於jax-ws已經理解的注入類型。它被提到here

Chapter 5 JAX-RS規範提供了可以與@Context一起使用的所有標準JAX-RS Java類型。

您可能想要使用類似@FormParam@PathParam的東西來代替。有關說明,請參閱規格的section 2.3。這裏是你的答案,從規範的這些部分複製:

一般的Java類型的方法參數可能的:

  1. 一個原始類型;
  2. 有一個接受單個String參數的構造函數;
  3. 有一個名爲valueOf或fromString的靜態方法,它接受一個String參數(例如,請參閱Integer.valueOf(String)和java.util.UUID.fromString(String));或
  4. 是List,Set或SortedSet,其中T滿足上述2或3。結果集合是隻讀的。
+0

正確。你只能注入12個允許的對象實例,如下所列:https://readlearncode.com/java-ee/what-is-javax-ws-rs-core-context-httpheaders-and-uriinfo/ – Alex

3

我想我可能會做些什麼......如果這樣做的話,馬丁應該得到部分功勞。 :)

看起來,@Provider類必須實現com.sun.jersey.spi.inject.Injectable < T>接口。但是,我不確定這是否足以實際注入@Context。缺少的是,我們必須告訴Web應用程序的ResourceConfig對象關於@Provider。在我想要做的,並採取從Neo4j的服務器提示的情況下,剩下的工作歸結爲:

  • 延伸com.sun.jersey.spi.container.servlet.ServletContainer,和壓倒一切的配置方法:
@Override 
protected void configure(WebConfig wc, ResourceConfig rc, WebApplication wa) 
{ 
    super.configure(wc, rc, wa); 
    Set<Object> singletons = rc.getSingletons(); 
    singletons.add(new MyObjectProvider()); 
} 
  • 指定該容器必須在web.xml部署描述符中使用:
<servlet> 
    <servlet-name>JAX-RS Servlet Container</servlet-name> 
    <servlet-class>com.blah.MyServletContainer</servlet-class> 
</servlet> 
+1

哦,不 - 你不需要那樣做。我編輯了我的答案,以顯示如何註冊您的提供商。 –