我有一个单例 EJB(javax.ejb.Singleton 版本。叹息。)它上面有一个 CDI 观察者方法。当我尝试将其部署到 glassfish 3.1 时,服务器无法在没有任何实际解释的情况下部署 EAR 文件 - 只是说部署期间出现异常而没有任何更多细节。
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 bean,则应用程序可以正常部署。同样,如果我删除 CDI 事件观察器方法,则应用程序部署良好。我实际上需要这个类是一个 EJB 单例,因为我想要 EJB 的事务、线程安全等,所以把它作为一个 @ApplicationScoped POJO 对我来说没有多大用处。不过,问题似乎并不局限于 Singleton bean - 我已经通过将注释更改为 @Stateless 和 @Stateful 进行了实验,但我遇到了同样的问题。
在我看来,这可能是 Weld 中的一个错误,也许 Weld 和 EJB 正在争论他们如何代理该方法 - 大概 EJB 需要添加一个拦截器类并包装该方法以确保线程安全,而 Weld 正在尝试做一些事情否则使事件监听器工作?
我是否误解了这里的某些东西,是否应该在 EJB 上根本不使用 CDI 事件处理程序(在这种情况下应该有来自 glassfish 的更好的错误消息)——或者这实际上只是 CDI 或 EJB 实现中的一个错误?