WildFly 11: CDI не работает

Я написал очень простое приложение, но CDI не работает должным образом:

Определение

@EJB private CustomerProviderSessionBeanLocal customerProvider;

не приводит к экземпляру бина.

Определение моего сессионного компонента без сохранения состояния

@Local
public interface CustomerProviderSessionBeanLocal { ... }

@Stateless
@EJB(name="ejb/CustomerProvider", beanInterface = CustomerProviderSessionBeanLocal.class, beanName = "CustomerProviderSessionBean")
public class CustomerProviderSessionBean implements 
CustomerProviderSessionBeanLocal ...

Бин контроллера (для JSF):

@SessionScoped @ManagedBean
public class BackingBean {
    @EJB private CustomerProviderSessionBeanLocal customerProvider;

JBoss дает:

java:global/2017_JEE_App_1_war_exploded/CustomerProviderSessionBean!beans.CustomerProviderSessionBeanLocal

java:app/2017_JEE_App_1_war_exploded/CustomerProviderSessionBean!beans.CustomerProviderSessionBeanLocal
java:module/CustomerProviderSessionBean!beans.CustomerProviderSessionBeanLocal
java:global/2017_JEE_App_1_war_exploded/CustomerProviderSessionBean
java:app/2017_JEE_App_1_war_exploded/CustomerProviderSessionBean
java:module/CustomerProviderSessionBean

Тем не менее, атрибут customerProvider не инициализируется. Вызван конструктор (можно увидеть в лог-файле). Я пробовал несколько вариантов (с / без имен, локальный интерфейс и т. Д.). Использование JNDI-Lookup работает:

initialContext = new InitialContext();
Object o = initialContext.lookup("java:app/2017_JEE_App_1_war_exploded/CustomerProviderSessionBean");

Использование того же JNDI-имени в аннотации @EJB не работает

Я не изменил конфигурацию дикой бабочки!

Кто-нибудь может помочь?

1 ответ

Я получил это, работая с Wildfly 11 и J2EE 7. Я добавил следующее в раздел "Глобальные модули" в файле standalone.xml.

<subsystem xmlns="urn:jboss:domain:ee:4.0"><global-modules><module name="javax.enterprise.api" slot="main"/>...</global-modules></subsystem>

Другой способ заставить его работать без изменения файла standalone.xml (или domain.xml). это добавить следующую банку к уху.

  1. КДИ-апи-1.2.jar

Похоже, что ваш контроллер JSF использует функцию управляемого компонента JSF вместо CDI. В этом случае @EJB не будет работать правильно Вы должны объявить свой класс следующим образом:

@javax.inject.Named
@javax.enterprise.context.SessionScoped
public class BackingBean {

    @EJB 
    private CustomerProviderSessionBeanLocal customerProvider;

}
Другие вопросы по тегам