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 не работает.

Я не изменил конфигурацию wildfly!

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


person Thomas Bayer    schedule 13.12.2017    source источник
comment
Если вы создали свой экземпляр BckingBean с помощью new BackingBean() CDI, он не будет работать. Вы?   -  person Rainer Feike    schedule 13.12.2017
comment
экземпляр поддерживающего компонента создается автоматически через JSF-доступ. ‹h:outputText value=#{backingBean.status}›‹/h:outputText›   -  person Thomas Bayer    schedule 13.12.2017
comment
Вы довольно дико смешиваете EJB и CDI. Во-первых, компонент CDI (@SessionScoped BackingBean в вашем случае) не обязательно должен быть @ManagedBean. Во-вторых, попробуйте @Inject вместо @EJB, если вы хотите, чтобы CDI выполнял эту работу (в этом bean-компоненте @SessionScoped).   -  person Siliarus    schedule 13.12.2017
comment
и не могли бы вы поделиться импортом для ManagedBean и SessionScoped?   -  person John Ament    schedule 14.12.2017


Ответы (2)


У меня это работает с 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. cdi-api-1.2.jar
person wrgoff    schedule 16.05.2019

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

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

    @EJB 
    private CustomerProviderSessionBeanLocal customerProvider;

}
person chkal    schedule 22.12.2017
comment
В этом случае @EJB не будет работать корректно это утверждение неверно. @EJB всегда отлично работал в родном JSF @ManagedBean целую вечность. Единственное, что не работает, это @Inject, но OP вообще его не использует. Проблема ОП в другом месте не видна в предоставленной информации. Я предполагаю, что OP на самом деле пытается получить доступ к экземпляру EJB внутри конструктора bean-компонента вместо @PostConstruct. Даже переход на CDI не решит эту проблему. - person BalusC; 22.12.2017
comment
Спасибо за разъяснения. Я не знал об этом. - person chkal; 22.12.2017