Бин @ApplicationScoped не очень хорошо знаком с Wildfly 16 - PullRequest
1 голос
/ 04 марта 2020

У меня есть бин @ApplicationScoped, который я хочу создать при запуске приложения (см. Пример кода ниже). Я зарегистрировался для события инициализации контекста сервлета, но метод init никогда не вызывался. FactoryLocator содержится в банке в каталоге моей войны WEB-INF / lib. Этот же код работал на 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..................");
        }
}

Один из обнаруженных мной обходных путей заключался в извлечении содержимого файлов jar из каталога WEB-INF / lib / моей войны в каталог моей войны WEB-INF / classes. Когда я сделал это, мой компонент FactorLocator был успешно создан. Я бы предпочел не делать этого.

После отладки во время развертывания войны я заметил, что ServletContext инициализируется перед обработкой всех бинов в каталоге lib войны (org.jboss.weld. bootstrap .BeanDeploymentModules: processBeanDeployments). Модуль войны не знает всех наблюдателей, пока все бины не будут обработаны. Однако ServletContextEvent запускается до того, как все наблюдатели станут известны.

Может ли случиться так, что ServletContext будет создан до того, как всем наблюдателям станет известно? Я отладил одно из приложений Wildfly QuickStart, и ServletContext не создается до тех пор, пока не будут обработаны все развертывания bean-компонентов и успешно выполнен приведенный ниже код. Должен ли быть гарантирован порядок, в котором это происходит?

...