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
@ManagedBeany 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
@RequestScopedu 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