tutorial servicios restful que jax con rest resources jetty jersey jax-rs

restful - servicios rest con jax rs



Acceda a objetos externos en la clase de recursos de Jersey (1)

Puede inyectar cosas escribiendo sus propias implementaciones InjectableProvider e Injectable y registrándolas como proveedores en su aplicación. Para ver un ejemplo de cómo se puede implementar dicho proveedor, puede consultar SingletonTypeInjectableProvider o PerRequestTypeInjectableProvider, que son clases auxiliares que puede usar para implementar eso y OAuthProviderInjectionProvider como ejemplo de una implementación concreta de un proveedor de tipo singleton.

Código de muestra:

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

y debería poder incrustar la instancia de Myobj usando @Context Annotation.

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

Tengo el escenario en el que tengo el siguiente servidor de embarcadero integrado:

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

y tiene la siguiente clase de recursos (usando el framework 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"); } }

Aquí en mi clase de recursos quiero acceder a un objeto "myobj". ¿alguien puede sugerirme cómo puedo acceder a él? porque la clase de recurso en directamente llamado por el marco.

[edit] Básicamente, ¿quiero saber cómo inyectar cualquier objeto en la clase de recursos?

[Editar]

Intenté esto:

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

siguiente es la clase de proveedor

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

y lo estoy usando en clase de recursos como:

@Context

InjectZk zk;

Obtengo el siguiente error al ejecutar el servidor:

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

¿Alguna sugerencia? (Por cierto, estoy usando embarcadero incrustado)