2011-05-14 73 views
7

我有一个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实现中的一个错误?

回答

5

我想这就是答案:

CDI观测方法显然必须是静态的或EJB的本地接口中声明,如果声明EJB本地接口。我加载EAR文件时

org.jboss.weld.exceptions.DefinitionException: WELD-000088 Observer method must be static or local business method: [method] public org.stain.ObserverBean.testMethod(EventClass) on [email protected] class org.stain.ObserverBean 

出于某种原因,GlassFish的不正确报告此异常,只是:一般来说,如果你试图声明观测方法不在本地接口从焊接得到一个异常喜欢这个说Exception while loading the app

将该方法添加到本地接口(或删除该类的接口声明)可以修复问题并允许应用程序正常加载。

3

我注意到与最新版本的焊接相同的问题。但是,如果添加@LocalBean注释,它将与@Singleton和@Singleton @Startup一起使用。