Glassfish 在OmniFaces中注入@EJB@Eager bean会导致;严重:没有用于注入org.omnifaces.cdi.eager.eangebeansrepository”的有效EE环境;

Glassfish 在OmniFaces中注入@EJB@Eager bean会导致;严重:没有用于注入org.omnifaces.cdi.eager.eangebeansrepository”的有效EE环境;,glassfish,ejb,cdi,eager-loading,omnifaces,Glassfish,Ejb,Cdi,Eager Loading,Omnifaces,使用@ApplicationScoped@Named@Eager,我的@EJB-注入的@Statelessbean未正确实例化并计算为null 我有一个@ApplicationScoped@ManagedBean(eager=true),用于安排一些作业。使用@EJB注释注入了一些@无状态bean,效果很好 在迁移到CDI注释的过程中,我添加了注释以替代标准CDI中缺少的@ManagedBean(eager=true): import javax.annotation.PostConstruct

使用
@ApplicationScoped@Named@Eager
,我的
@EJB
-注入的
@Stateless
bean未正确实例化并计算为
null

我有一个
@ApplicationScoped@ManagedBean(eager=true)
,用于安排一些作业。使用
@EJB
注释注入了一些
@无状态
bean,效果很好

在迁移到CDI注释的过程中,我添加了注释以替代标准CDI中缺少的
@ManagedBean(eager=true)

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.EJB;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.omnifaces.cdi.Eager;

@Named
@ApplicationScoped
@Eager
public class MyScheduler implements Serializable {

    @EJB
    private MyService myService;
    @Inject
    private MyNamedBean myNamedBean;

    @PostConstruct
    public void init() {
        setupSchedulers();
    }

    @PreDestroy
    public void destroy() {
        destroySchedulers();
    }
    //...
}
使用此设置,可以在应用程序启动时正确调用
@PostConstruct
方法(尽管它似乎在初始化上下文之前就运行了),但是
myService
的计算结果为
null

在日志中,会出现以下警告:

Severe:   No valid EE environment for injection of org.omnifaces.cdi.eager.EagerBeansRepository
Severe:   No valid EE environment for injection of my.package.MyScheduler
Info:   Initializing Mojarra 2.2.8 ( 20140814-1418 https://svn.java.net/svn/mojarra~svn/tags/2.2.8@13507) for context '/tagific'
由于我需要从其他bean访问此bean,因此无法使用
@Singleton
@Schedule
注释


如何将
@无状态
bean正确地注入名为
@的应用程序范围bean中,该bean将在应用程序启动时实例化?

这看起来像GlassFish中的初始化排序错误。
@Eager@ApplicationScoped
ServletContextListener
中运行。显然GlassFish还没有准备好注射EJB。该结构适用于WildFly等

然而,以CDI的名义,在整个JavaEE中统一各种不同的依赖注入方法,您也可以只使用
@Inject
而不是
@EJB
。CDI代理能够进一步委托给右侧的
@无状态
实例

@Inject
private MyService myService;
您也可以在EJB本身内部使用
@Inject
,但到目前为止(JavaEE7),它还不支持自引用,例如
@Asynchronous
方法。为此,您仍然必须坚持使用
@EJB



也就是说,您是否知道Oracle停止了对GlassFish的商业支持,您最好不要将其用于生产环境?另请参见。

哪个容器impl/version?在WildFly 8.1为我工作。或者,尝试
@Inject
而不是
@EJB
(顺便说一句,应该正常工作)。我使用的是glassfish 4.0,Mojarra 2.2.8。使用@Inject解决了这个问题。请添加一个我可以接受的答案。如果您能解释一下为什么
@EJB
不起作用,以及日志中缺少的EE上下文,那就太好了。谢谢