2011-09-22 97 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

看起来像帕维尔编辑我的回应,并添加示例代码 - 谢谢你,帕维尔 –