【问题标题】:Are CDI event observer methods compatible with EJBs?CDI 事件观察器方法是否与 EJB 兼容?
【发布时间】:2011-05-14 15:39:30
【问题描述】:

我有一个单例 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 正在尝试做其他事情来使事件监听器工作?

我是否误解了一些东西,CDI 事件处理程序是否应该根本不用于 EJB(在这种情况下应该有来自 glassfish 的更好的错误消息) - 或者这实际上只是 CDI 或 EJB 实现中的一个错误?

【问题讨论】:

    标签: glassfish java-ee-6 cdi ejb-3.1 jboss-weld


    【解决方案1】:

    我想这就是答案:

    如果 EJB 声明了本地接口,CDI 观察者方法显然必须是静态的或在 EJB 的本地接口中声明。通常,如果您尝试声明不在本地接口中的观察者方法,您会从 Weld 中得到一个异常,如下所示:

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

    由于某种原因,glassfish 在加载我的 EAR 文件时没有正确报告此异常,只是说Exception while loading the app

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-08
        • 1970-01-01
        • 1970-01-01
        • 2013-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多