Tengo un Singleton EJB (javax.ejb.Singleton version. Suspiro.) Que tiene un método de observador CDI en él. Cuando trato de implementar esto en glassfish 3.1, el servidor no puede desplegar el archivo EAR sin una explicación real, simplemente diciendo que hubo una excepción durante el despliegue sin más detalles.¿Los métodos de observadores de eventos CDI son compatibles con los EJB?
SEVERE: Exception while loading the app
SEVERE: Exception while shutting down application container
....
SEVERE: Exception while shutting down application container : java.lang.NullPointerException
Este es el detector de eventos CDI:
public void updateFromGranule(@Observes @CloudMask GranuleAvailableEvent granuleEvent) {
LOG.info("updating cloud map");
update(granuleEvent.getGranule(), CloudMask.class);
fireUpdate();
}
Si cambio el grano Singleton ser sólo un bean @ApplicationScoped la aplicación despliega bien. De forma similar, si elimino el método de observador de eventos CDI, la aplicación se implementa correctamente. Realmente necesito que la clase sea un singleton de EJB porque quiero la transacción, seguridad de subprocesos, etc. de los EJB, así que dejar esto como POJO @ApplicationScoped no me sirve mucho. Sin embargo, el problema no parece estar limitado a los beans de Singleton: he experimentado cambiando la anotación a @Stateless y @Stateful y me sale el mismo problema.
Me parece que esto podría ser un error en Weld, quizás Weld y EJB están peleando acerca de cómo proxy ese método - presumiblemente EJB necesita agregar una clase interceptora y ajustar ese método para garantizar la seguridad del hilo, y Weld es tratando de hacer algo más para que funcione el oyente del evento?
¿Estoy entendiendo algo aquí, y los manejadores de eventos CDI simplemente no deberían usarse en EJB (en cuyo caso debería haber mejores mensajes de error de glassfish) o esto es solo un error en la implementación de CDI o EJB?