我有一个Singleton EJB(javax.ejb.Singleton版本。叹气),它有一个CDI观察者方法。当我尝试将其部署到glassfish 3.1时,服务器无法在没有任何真正解释的情况下部署EAR文件 - 只是说在部署过程中出现异常而没有任何更多细节。CDI事件观察者方法是否与EJB兼容?
SEVERE: Exception while loading the app
SEVERE: Exception while shutting down application container
....
SEVERE: Exception while shutting down application container : java.lang.NullPointerException
这是CDI事件侦听器:
public void updateFromGranule(@Observes @CloudMask GranuleAvailableEvent granuleEvent) {
LOG.info("updating cloud map");
update(granuleEvent.getGranule(), CloudMask.class);
fireUpdate();
}
如果我改变一个singleton bean只是一个@ApplicationScoped豆的应用程序部署的罚款。同样,如果我删除了CDI事件观察者方法,则应用程序部署得很好。 我实际上需要这个类是一个EJB单例,因为我想要EJB的事务,线程安全等等,所以把它作为@ApplicationScoped POJO留给我的用处不大。这个问题似乎并不局限于Singleton bean,尽管我已经通过将注释更改为@Stateless和@Stateful来进行实验,并且我遇到了同样的问题。
在我看来,这可能是Weld中的一个错误,或许Weld和EJB正在争取他们如何代理该方法 - 可能EJB需要添加一个拦截器类并包装该方法以确保线程安全,Weld is试图做其他事情来使事件监听器工作?
我在这里误解了一些东西,如果CDI事件处理程序不能用于EJB(在这种情况下,应该有更好的来自glassfish的错误消息) - 或者这实际上只是CDI或EJB实现中的一个错误?