java - ¿Puedo usar CDI para @Inject una clase en Jersey 1.x?
glassfish-3 jersey-1.0 (1)
Creo que estoy haciendo esta pregunta, pero para Jersey 1.x: Inyección de dependencia con Jersey 2.0
Estoy usando Glassfish 3, CDI y Jersey 1.x. Tengo un @WebService
que está inyectando una clase como esta:
@Inject
Foo foo;
Lo probé en @WebService
y funciona. Pero la misma línea de código en mi recurso de Jersey arroja un NPE cuando intenta usar foo
. Creo que Jersey 1.x está ignorando las anotaciones de CDI. ¿Cómo puedo obtener la inyección de dependencia funcionando como lo hace en mi @WebService
?
Foo
es un pojo y mi web.xml está usando el ServletContainer:
<servlet>
<servlet-name>JerseyServlet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
Encontré algo de ayuda aquí . El problema es que mis Foo
@Inject
s son propios (en realidad son EJB que provienen de una clase con @Provides
). resourceContext.getResource(Foo.class);
devuelve una instancia de Foo
, pero los campos de @Inject
ed son nulos.
Encontré un artículo que explica cómo hacer esto:
El problema aquí es que CDI no está en su lugar para instanciar la dependencia. Sus [sic] son dos soluciones para este problema:
- Deje que CDI ejemplifique la dependencia, pero deje que Jersey lo administre. Esto se puede lograr utilizando
@ManagedBean
y una anotación específica de Jersey.- Deje CDI crear instancias de la dependencia y deje que CDI lo administre. Esto se puede lograr utilizando
@RequestScoped
u otras anotaciones específicas de CDI.
Elegí la primera opción y puse la anotación javax.annotation.ManagedBean
en mi recurso. Aquí hay un ejemplo :
package com.coderskitchen.thegreeter.rest;
import com.coderskitchen.thegreeter.greetings.GreetingService;
import javax.annotation.ManagedBean;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
@Path("/greet")
@ManagedBean
public class Greeter {
@Inject
GreetingService gs;
@GET
@Path("{name}")
public String greetSomeone(@PathParam("name") String name) {
return gs.greetSomeone(name);
}
}
* También encontré este artículo oficial, que en realidad no es tan útil: http://docs.oracle.com/javaee/7/tutorial/doc/jaxrs-advanced004.htm