我有一个@ApplicationScoped bean,我希望在应用程序启动时实例化它(参见下面的示例代码)。我已经注册了servlet上下文初始化事件,但是init方法从未被调用过。FactoryLocator包含在我的war的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..................");
        }
}我发现的一种解决方法是将war的WEB-INF/lib/目录中的jars内容解压缩到war的WEB-INF/classes目录中。当我这样做时,我的FactorLocator bean被成功地实例化了。我不希望不得不这么做。
在对war的部署进行调试之后,我注意到在对war的lib目录中的所有bean进行(org.jboss.weld.bootstrap.BeanDeploymentModules:processBeanDeployments).处理之前,ServletContext已被初始化在处理完所有bean之前,war的模块并不知道所有的观察者。但是,在所有观察者都知道之前,ServletContextEvent就会被触发。
如果在知道所有观察者之前就创建了ServletContext,会发生这种情况吗?我已经调试了一个Wildfly QuickStart应用程序,直到处理完所有ServletContext部署并成功执行下面的代码后,才会创建bean。这种情况发生的顺序应该是有保证的吗?
发布于 2021-03-02 18:24:13
以防其他人也看到了同样的问题。升级到Wildfly 21.0.1最终为我解决了这个问题。
https://stackoverflow.com/questions/60524332
复制相似问题