代码之家  ›  专栏  ›  技术社区  ›  Mario Köhler

为什么我的CDI启动类被调用了两次?

  •  0
  • Mario Köhler  · 技术社区  · 7 年前

    我正在使用下面的类在完成后进行一些初始化。帕亚拉发生了战争。我可以看到init()方法实际上在应用程序启动期间被调用了两次。

    package mypackage;
    
    import javax.enterprise.context.ApplicationScoped;
    import javax.enterprise.context.Initialized;
    import javax.enterprise.event.Observes;
    import javax.inject.Inject;
    
    import lombok.extern.log4j.Log4j2;
    
    @Log4j2
    @ApplicationScoped
    public class StartupService {
    
        @Inject LogConfig logConfig;
    
        void init(@Observes @Initialized(ApplicationScoped.class) Object init) {
            log.debug("### STARTUP SERVICE CALLED ###");
    
            logConfig.startup();
        }
    }
    

    我的意思是,我当然可以实现一个静态布尔标志来识别我之前已经被调用过一次,但我更愿意修复根本原因,并且从一开始只被调用一次。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Siliarus    7 年前

    好的,我试着总结一下,可能不完全是这样,我可以试着深入挖掘。但这是我认为正在发生的事情。。。

    您将获得两次事件,每次使用不同的负载。 这可能有多种原因,但最有可能的原因是帕拉亚在集成方面有一个微小的缺陷。Weld建议集成商定义其通过SPI运行的环境。如果没有,Weld可以处理,但需要做一些假设和猜测,以满足规范要求。

    在这种情况下,我怀疑帕拉亚错误地定义了 Environment ServletContext 有效载荷,而模块的其余部分具有普通 Object

    可悲的是,除了抢先获得有关环境的信息外,没有简单的方法可以防止这两个事件被触发。原因是Weld需要决定 对象

    你的解决方案 对象 一个更具体的类型-因此只观察到一个事件。根据你的样本,我想 有效载荷将是您正在寻找的。