访问 Jersey Resource 类中的外部对象 [英] Access external objects in Jersey Resource class

查看:30
本文介绍了访问 Jersey Resource 类中的外部对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

 服务器 server = new Server(8080);上下文根 = new Context(server, "/", Context.SESSIONS);根.addServlet(新的 ServletHolder(新的 ServletContainer(新的 PackagesResourceConfig(edu.mit.senseable.livesingapore.platform.restws.representations"))),"/");Myobj myobj = new Myobj(12,13)​​;server.start();

并具有以下资源类(使用 Jersey 框架)

 导入 javax.ws.rs.Consumes;导入 javax.ws.rs.FormParam;导入 javax.ws.rs.GET;导入 javax.ws.rs.POST;导入 javax.ws.rs.Path;导入 javax.ws.rs.PathParam;导入 javax.ws.rs.Produces;导入 javax.ws.rs.core.MediaType;@小路("/")公共类数据流{@得到@Path("/数据流")@Produces(MediaType.TEXT_PLAIN)公共字符串 getDataStreams() {返回 getStreams("text");}}

在我的资源类中,我想访问一个对象 "myobj" .有人可以建议我如何访问它吗?因为框架直接调用的资源类.

基本上我想知道如何将任何对象注入资源类?

我试过了:

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

下面是提供者类

 @Provider公共类 InjectZk {私有 ZooKeeper zk;公共 InjectZk() {//TODO 自动生成的构造函数存根}公共 InjectZk(ZooKeeper zk) {//TODO 自动生成的构造函数存根这个.zk = zk;}公共动物园管理员 getZk() {返回 zk;}}

我在资源类中使用它:

 @Context

InjectZk zk;<​​/p>

我在运行服务器时遇到以下错误:

严重:缺少字段的依赖项:edu.mit.senseable.livesingapore.platform.core.components.clientrequest.InjectZk edu.mit.senseable.livesingapore.platform.core.components.clientrequest.DataStreams.zk2011-09-28 16:18:47.714:/:WARN: 不可用com.sun.jersey.spi.inject.Errors$ErrorMessagesException

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

解决方案

您可以通过编写自己的 InjectableProvider 和 Injectable 实现并将它们注册为应用程序中的提供程序来注入东西.有关如何实现此类提供程序的示例,您可以查看 SingletonTypeInjectableProviderPerRequestTypeInjectableProvider 是助手你可以用来实现它的类和 OAuthProviderInjectionProvider 获取单例类型提供程序的具体实现示例.

示例代码:

 服务器 server = new Server(8080);上下文根 = new Context(server,"/",Context.SESSIONS);ResourceConfig rc = new PackagesResourceConfig("edu.mit.senseable.livesingapore.platform.restws.representations");rc.getSingletons().add(new SingletonTypeInjectableProvider(Myobj.class, new Myobj(12,13)​​){});root.addServlet(new ServletHolder(new ServletContainer(rc)), "/");server.start();

并且您应该能够使用 @Context 注释来注入 Myobj 实例.

@Path("/helloworld")公共类 HelloWorldResource {@Context Myobj 我的类;……}

I have the scenario where I have the following embedded jetty server:

    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();

and have the following resource class (using Jersey framework)

    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");
   }
}

Here in my resource class I want to access a object "myobj" . can someone suggest how I can access it? because the resource class in directly called by the framework.

[edit] Basically I want to know how to inject any object into resource class?

[Edit]

I tried this:

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

following is the provider class

  @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;
   }

}

and I am using it in resource class as:

 @Context

InjectZk zk;

I am getting the following erorr while running the server:

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

Any suggestions? ( BTW I am using Embedded jetty)

解决方案

You can inject things by writing your own InjectableProvider and Injectable implementations and registering them as providers in your application. For an example of how such provider can be implemented you can check the SingletonTypeInjectableProvider or PerRequestTypeInjectableProvider which are helper classes you can use to implement that and OAuthProviderInjectionProvider for an example of a concrete implementation of a singleton type provider.

sample code:

    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();

and you should be able to incject Myobj instance using @Context annotation.

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

这篇关于访问 Jersey Resource 类中的外部对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆