Soy nuevo en Java EE 6 y CDI. He leído un par de tutoriales y la documentación de soldadura. Sin embargo, algo que debería funcionar desde mi entendimiento no lo hace, así que necesito ayuda.Inyección CDI de un EJB lleva a NullPointerException
Tengo la siguiente situación. Creé una aplicación Java EE 6 con NetBeans 7.0.1 usando el arquetipo maven suministrado con el IDE e implemento para GlassFish 3.1 también suministrado por el IDE.
beans.xml está ubicado en el directorio META-INF de mi jar EJB.
He creado una clase que trabaja Soley como clase productora de mis artefactos EJB (y EntityManager)
@Stateless
public class EjbArtifactProducer {
@PersistenceContext(unitName = "trackProfiler-PU")
private EntityManager em;
@EJB
private UserFacadeLocal userFacade;
@EJB
private AuthServiceLocal authService;
@EJB
private NewsEntryFacadeLocal newsEntryFacade;
@EJB
private RoleFacadeLocal roleFacade;
@EJB
private TrackCommentFacade trackCommentFacade;
@EJB
private TrackFacade trackFacade;
@EJB
private TrackTypeFacade trackTypeFacade;
@EJB
private WaypointFacadeLocal waypointFacade;
@Produces
public AuthServiceLocal getAuthService() {
return authService;
}
@Produces
public EntityManager getEm() {
return em;
}
@Produces
public NewsEntryFacadeLocal getNewsEntryFacade() {
return newsEntryFacade;
}
@Produces
public RoleFacadeLocal getRoleFacade() {
return roleFacade;
}
@Produces
public TrackCommentFacade getTrackCommentFacade() {
return trackCommentFacade;
}
@Produces
public TrackFacade getTrackFacade() {
return trackFacade;
}
@Produces
public TrackTypeFacade getTrackTypeFacade() {
return trackTypeFacade;
}
@Produces
public UserFacadeLocal getUserFacade() {
return userFacade;
}
@Produces
public WaypointFacadeLocal getWaypointFacade() {
return waypointFacade;
}
}
que intentaron aplicar la anotación @Produces directamente a los campos de una en métodos como se muestra arriba.
Sin embargo, el siguiente no inyecta nada en otro EJB
@Inject
private NewsEntryFacadeLocal newsEntryFacade;
Esto se hace en un EJB de sesión sin estado, pero cuando intento acceder a la newsEntryFacade en cualquiera de mis métodos de negocio se lanza una NullPointerException. Entonces claramente no está ocurriendo una Inyección o mis productores producen referencias nulas.
¿Echo de menos algo? O debería este trabajo de acuerdo con CDI/Weld?
Curiosamente parece que funciona de esa manera cuando intento @Inject EJB en la parte de aplicaciones web (sin embargo que necesitaba un extra de clase productor en mi .war para que esto funcione, es esto como que debe ser?) .
EDITAR: El proyecto funciona con una construcción ant (generada por NetBeans). ¿Hay problemas con el arquetipo Maven proporcionado por NetBeans? Parece que con el arquetipo de Maven hay algunos problemas con la inyección de CDI entre los módulos war y ejb. Descubrí que si tenía productores por separado en el módulo web y ejb Glassfish genera un error de despliegue que indica que hay dos implementaciones indistinguibles de una interfaz. Pero cuando elimino al productor en el módulo web, Weld se queja de que el EJB que quiero inyectar en mis beans en el módulo web no se puede resolver. También con la construcción Ant, los EJB pueden ser @Injected sin un productor, mientras que la construcción maven necesita campos de producción en una clase. No puedo explicar cómo esto podría pasar. Después de todo, el despliegue final debería ser más o menos igual, ¿no es así?
La otra EJB que has intentado inyectar, ¿está en el mismo jar EJB o en otro archivo? A tener en cuenta: para habilitar bean-discovery (o CDI) beans.xml debe estar presente en cada uno de los archivos de despliegue. En WEB-INF para .wars y en META-INF para .jars – stratwine
Sí. Ambos tienen un beans.xml. –
He intentado convertir mi proyecto en una construcción ant. Todo funciona bien ahora Ni siquiera necesito crear productores separados para los módulos war y ejb. La pregunta ahora es: ¿Hay algún problema con el arquetipo maven? ¿O hay alguna advertencia especial a considerar? –