@ApplicationScoped Bean未在Wildfly 16上实例化

时间:2020-03-04 10:48:24

标签: jboss wildfly cdi

我有一个@ApplicationScoped bean,希望在应用程序启动时实例化它(请参见下面的示例代码)。我已经注册了servlet上下文初始化事件,但是从未调用过init方法。 FactoryLocator包含在我的战争的WEB-INF / lib目录中的一个jar中。相同的代码可在Wildfly 9上使用,但在升级到Wildfly 16后不再可用。

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.context.Initialized;
import javax.enterprise.event.Observes;
import javax.servlet.ServletContext;

@ApplicationScoped
public class FactoryLocator {
    public FactoryLocator() {
        System.out.println("In the constructor.........................");
    }

    private void init(@Observes @Initialized(ApplicationScoped.class) ServletContext sc) {
        System.out.println("Invoking the event observer method..................");
        }
}

我发现的一种解决方法是将战争的WEB-INF / lib /目录中的jar内容提取到战争的WEB-INF / classes目录中。当我这样做时,我的FactorLocator bean被成功实例化了。我不想这样做。

在对战争的部署进行调试之后,我注意到在处理战争的lib目录中的所有bean之前,已初始化ServletContext(org.jboss.weld.bootstrap.BeanDeploymentModules:processBeanDeployments)。在处理所有bean之前,战争的模块并不知道所有观察者。但是,会在所有观察者都知道之前触发ServletContextEvent。

是否会在所有观察者都知道之前创建ServletContext?我已经调试了Wildfly QuickStart应用程序之一,直到处理完所有bean部署并且成功执行以下代码后,才创建ServletContext。这样发生的顺序是否应该得到保证?

1 个答案:

答案 0 :(得分:0)

以防万一其他人看到了同样的问题。升级到 Wildfly 21.0.1.Final 为我解决了这个问题。