2011-09-22 131 views
1

我有,我有以下嵌入的Jetty服務器的情景:訪問外部對象

Server server = new Server(8080); 
     Context root = new Context(server, "/", Context.SESSIONS); 
     root.addServlet(
      new ServletHolder(
        new ServletContainer(
         new PackagesResourceConfig(
           "edu.mit.senseable.livesingapore.platform.restws.representations"))), 
      "/"); 
Myobj myobj = new Myobj(12,13); 
     server.start(); 

,並具有以下資源類(使用Jersey框架)

import javax.ws.rs.Consumes; 
import javax.ws.rs.FormParam; 
import javax.ws.rs.GET; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.PathParam; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 

@Path("/") 
public class DataStreams { 
    @GET 
    @Path("/datastreams") 
    @Produces(MediaType.TEXT_PLAIN) 
    public String getDataStreams() { 
     return getStreams("text"); 
    } 
} 

在這裏,我的資源類我想訪問一個對象「myobj」。有人可以建議我如何訪問它?因爲該框架直接調用資源類。

[編輯] 基本上我想知道如何注入任何對象爲資源類?

[編輯]

我嘗試這樣做:

pkgrc.getSingletons().add(
     new SingletonTypeInjectableProvider<Annotation, InjectZk>(
       InjectZk.class, new InjectZk(this.zooKeeper)) { 
     }); 

以下是提供程序類

@Provider 
public class InjectZk { 
    private ZooKeeper zk; 

    public InjectZk() { 
     // TODO Auto-generated constructor stub 
    } 

    public InjectZk(ZooKeeper zk) { 
     // TODO Auto-generated constructor stub 
     this.zk = zk; 
    } 

    public ZooKeeper getZk() { 
     return zk; 
    } 

} 

,我使用它的資源類如:

@Context 

InjectZk zk;

我正在以下erorr運行的服務器,同時:

SEVERE: Missing dependency for field: edu.mit.senseable.livesingapore.platform.core.components.clientrequest.InjectZk edu.mit.senseable.livesingapore.platform.core.components.clientrequest.DataStreams.zk 
2011-09-28 16:18:47.714:/:WARN: unavailable 
com.sun.jersey.spi.inject.Errors$ErrorMessagesException 

有什麼建議? (順便說一句,我使用的嵌入式碼頭)

回答

3

您可以通過編寫自己的InjectableProvider和注射的實現和註冊爲您的應用程序供應商注入的東西。對於這樣的提供商如何實現您可以檢查一個例子SingletonTypeInjectableProviderPerRequestTypeInjectableProvider這是輔助類,你可以使用來實現這一點,對於OAuthProviderInjectionProvider具體實施單類型的提供的一個例子。

示例代碼:

Server server = new Server(8080); 
    Context root = new Context(server,"/",Context.SESSIONS); 

    ResourceConfig rc = new PackagesResourceConfig("edu.mit.senseable.livesingapore.platform.restws.representations"); 
    rc.getSingletons().add(new SingletonTypeInjectableProvider<javax.ws.rs.core.Context, Myobj>(Myobj.class, new Myobj(12,13)){}); 

    root.addServlet(new ServletHolder(new ServletContainer(rc)), "/"); 
    server.start(); 

,你應該能夠使用@Context註釋incject MyObj中的實例。

@Path("/helloworld") 
public class HelloWorldResource { 
    @Context Myobj myClass; 
    .... 
} 
+0

您可以推薦一些示例代碼?我很抱歉,我是這個領域的新手,我也使用嵌入式碼頭與球衣 – rinku

+0

,你可以在[這個線程]中找到基本的InjectableProvider實現(http://stackoverflow.com/questions/7121445/how-to-wire-in -a合作者 - 到 - 一個汗布資源/ 7122265#7122265) –

+0

看起來像帕維爾編輯我的迴應,並添加示例代碼 - 謝謝你,帕維爾 –