【问题标题】:Access external objects in Jersey Resource class访问 Jersey Resource 类中的外部对象
【发布时间】:2011-09-22 07:08:02
【问题描述】:

我有以下嵌入式码头服务器的场景:

    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;

运行服务器时出现以下错误:

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

有什么建议吗? (顺便说一句,我使用的是嵌入式码头)

【问题讨论】:

    标签: rest resources jetty jersey jax-rs


    【解决方案1】:

    您可以通过编写自己的 InjectableProvider 和 Injectable 实现并将它们注册为应用程序中的提供程序来注入东西。有关如何实现此类提供程序的示例,您可以查看SingletonTypeInjectableProvider 或PerRequestTypeInjectableProvider,它们是您可以用来实现该功能的辅助类,以及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 注释来注入 Myobj 实例。

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

    【讨论】:

    • 你能推荐一些示例代码吗?对不起,我是这个领域的新手,而且我正在使用带有球衣的嵌入式码头
    • 你可以在this thread找到基本的 InjectableProvider 实现
    • 看起来 Pavel 编辑了我的回复并添加了示例代码 - 谢谢,Pavel
    • @Pavel Bucek 它不起作用 :( (Myobj 是否必须在 sam 包中?)因为我收到以下错误:严重:资源和/检测到以下错误和警告或提供者类:严重:缺少字段的依赖项:org.test.Myobj edu.mit.senseable.livesingapore.platform.core.components.clientrequest.DataStreams.myobj
    • 该死的......对不起,代码示例中有一个“小”错误。 SingletonTypeInjectableProvider 必须通过以下方式启动:new SingletonTypeInjectableProvider(Myobj.class, new Myobj(12,13)​​){}。我也会更新答案。
    猜你喜欢
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    相关资源
    最近更新 更多