java jersey glassfish-3 cdi jersey-1.0

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:

  1. 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.
  2. 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