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.2.jar
Похоже, что ваш контроллер JSF использует функцию управляемого компонента JSF вместо CDI. В этом случае @EJB
не будет работать правильно Вы должны объявить свой класс следующим образом:
@javax.inject.Named
@javax.enterprise.context.SessionScoped
public class BackingBean {
@EJB
private CustomerProviderSessionBeanLocal customerProvider;
}