Доступ к внешним объектам в классе ресурсов Джерси - PullRequest
1 голос
/ 22 сентября 2011

У меня есть сценарий, где у меня есть следующий встроенный джет-сервер:

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

и следующий класс ресурсов (с использованием фреймворка Джерси)

    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".может кто-нибудь подсказать, как мне получить к нему доступ?потому что класс ресурсов напрямую вызывается фреймворком.

[edit] В основном я хочу знать, как внедрить любой объект в класс ресурсов?

[Edit]

Iпопробовал это:

 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

Есть предложения?(Кстати, я использую встроенный причал)

1 Ответ

3 голосов
/ 22 сентября 2011

Вы можете внедрить вещи, написав свои собственные реализации 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();

, и вы сможете внедрить экземпляр Myobj, используя аннотацию @Context.

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