Terminé usando Google Guice, que es un marco DI liviano que se integra bien con Jersey. Esto es lo que tenía que hacer:
En primer lugar, he añadido dependencias en el pom.xml:
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>3.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-guice</artifactId>
<version>1.12</version>
<scope>compile</scope>
</dependency>
que quería un DAO implementa como un conjunto unitario con una interfaz:
public interface MySingletonDao
{
// ... methods go here ...
}
y una implementación concreta:
@Singleton
public class ConcreteMySingletonDao implements MySingletonDao
{
// ... methods go here ...
}
Decorado las clases de recursos como lo siguiente:
@Path("/some/path")
@RequestScoped
public class MyResource
{
private final MySingletonDao mySingletonDao;
@Inject
public MyResource(MySingletonDao mySingletonDao)
{
this.mySingletonDao = mySingletonDao;
}
@POST
@Produces("application/json")
public String post() throws Exception
{
// ... implementation goes here ...
}
}
creado una clase que va a hacer las fijaciones:
public class GuiceConfig extends GuiceServletContextListener
{
@Override
protected Injector getInjector()
{
return Guice.createInjector(new JerseyServletModule()
{
@Override
protected void configureServlets()
{
bind(MyResource.class);
bind(AnotherResource.class);
bind(MySingletonDao.class).to(ConcreteMySingletonDao.class);
serve("/*").with(GuiceContainer.class);
}
});
}
}
que utilizan embarcadero en lugar de Glassfish para actuar realmente como servidor.En mi prueba de funcionamiento, que se ve algo como:
private void startServer() throws Exception
{
this.server = new Server(8080);
ServletContextHandler root =
new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS);
root.addEventListener(new GuiceConfig());
root.addFilter(GuiceFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
root.addServlet(EmptyServlet.class, "/*");
this.server.start();
}
El EmptyServlet
proviene de código de ejemplo de Sunny Gleason dada a cabo como respuesta a: https://stackoverflow.com/a/3296467 - que originalmente tenían
root.addServlet(new ServletHolder(new ServletContainer(new PackagesResourceConfig("com.example.resource"))), "/*");
en lugar de la línea
root.addServlet(EmptyServlet.class, "/*");
Pero eso hizo que Jersey intentara realizar la inyección de dependencia en lugar de Guice, lo que provocó errores de tiempo de ejecución.
http://jersey.java.net/documentation/latest/migration.html#mig-server-inject-custom-objects – tuxSlayer