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)