cdi bean-инъекция для кода инициализации

У меня настроен bean-компонент с некоторой логикой инициализации. Я аннотировал этот компонент, используя аннотацию @ApplicationScoped. Но почему-то cdi не выбирает этот компонент.

Содержимое файла beans.xml:

    <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
    bean-discovery-mode="annotated">
</beans>

Файл компонента:

@ApplicationScoped
public class Initializer{

    @Inject @ConfigProperty(name = "app.name")
    private String appName;
    @Inject @ConfigProperty(name = "app.token")
    private String appToken;
    @Inject @ConfigProperty(name = "app.version")
    private String appVersion;

    @PostConstruct
    public void init() {
       System.out.println("flow should come here....); //but this line does not execute.
    }
}

Код для чтения файла конфигурации:

@Exclude
public class ConfigurationFile implements PropertyFileConfig {

    @Override
    public String getPropertyFileName() {
    String env = Util.getEnv();
    switch (env) {
    case "dev":
    case "uat":
    case "prod":
        return "config/" + env + "/default.properties";
    default:
        return "config/default.properties";
    }
    }

    @Override
    public boolean isOptional() {
    return false;
    }
}

Я использую: cdiL: для внедрения зависимостей, apache-deltaspike: для чтения файла конфигурации. wildfly-рой: сервер


person G.G.    schedule 26.03.2018    source источник
comment
Простое добавление области действия не делает ее управляемым компонентом. Добавьте аннотацию @Named   -  person Kukeltje    schedule 26.03.2018
comment
Я не уверен, что такое cdiL, поэтому сложно комментировать, в чем может быть проблема.   -  person Ken    schedule 26.03.2018
comment
Вы на самом деле используете этот боб как-то? Weld (используемый вами CDI impl) инициируется лениво и не будет создавать фактический bean-компонент до тех пор, пока он не понадобится, например. он не будет вызывать @PostConstruct - добавьте какой-нибудь фиктивный метод для этого компонента и попробуйте его вызвать.   -  person Siliarus    schedule 26.03.2018
comment
Спасибо за отзыв.   -  person G.G.    schedule 26.03.2018
comment
В Кукельтье: Это не так. @Named просто необязателен для доступа к bean-компоненту через EL.   -  person Alex Fire    schedule 28.03.2018


Ответы (1)


У меня есть решение этой проблемы.

Проблема решается путем изменения объявления метода следующим образом:

public void init(@Observes @Initialized(ApplicationScoped.class) Object init) {
//................code logic here................
}
person G.G.    schedule 26.03.2018