2011-11-17 7 views
9

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í?

+0

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

+0

Sí. Ambos tienen un beans.xml. –

+0

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? –

Respuesta

0

Intenta poner @Named en EjbArtifactProducer. Además, si el producto es así de simple, creo que es mejor eliminarlo también (de lo contrario, deberías hacer un cambio más).

1

Si desea usar @Inject, anótelo como @Named @ApplicationScoped, de lo contrario, use @EJB al inyectar su singleton.

0

Difícil de decir qué está yendo mal, pero lo que definitivamente no funcionó para nosotros es usar CDI entre los límites del cargador de clases. Por ejemplo, si su aplicación está empaquetada como un archivo ear, tendrá sus ejbs en un archivo jar y su aplicación web en su archivo war. En este caso, no puede usar CDI para inyectar sus ejbs en su capa web. El problema es que el jar y la guerra son cargados por diferentes cargadores de clases. Quizás las implementaciones de CDI más nuevas se comportan de forma diferente, pero al menos JBoss 6 y Glassfish tuvieron este problema.

1

Jordan Denison es correcto. Está intentando @Inject y EJB, pero está utilizando @EJB para EJB.Tu clase EJB probablemente está anotada con @Stateless o algo así. @Inject se debe utilizar en beans de sesión anotados con @Named y algún tipo de ámbito.

0

está mezclando dos conceptos diferentes ... use CDI como respaldo de JSF. (CDI en contenedor web) y usa EJB y JPA en la capa empresarial ... la capa CDI puede inyectar un EJB para llamar al método comercial específico.

En este caso, tiene una separación clara en las preocupaciones.

BTW: ¡no necesita interfaces EJB en absoluto! use solo interfaces si tiene requisitos para comunicarse desde un control remoto ... (@Remote). con la anotación @LocalBean puede inyectar directamente el propio EJB ..

si tiene una separación de capas limpia cada una con su propia preocupación, creo que es mejor que encuentre la razón para esta NullPointerException ... y creo que su NullPointerException no existe más después de esto ...

estratificación:

web Browser -> JSF Facelet -> Copia de frijol CDI -> Servicio de EJB (s) -> EntityManager

+0

enlace interesante sobre interfaces -> http://www.adam-bien.com/roller/abien/entry/how_to_deal_with_interfaces – StefanHeimberg

Cuestiones relacionadas