Я написал очень простое приложение, но 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!
Кто-нибудь может помочь?
@SessionScoped BackingBean
в вашем случае) не обязательно должен быть@ManagedBean
. Во-вторых, попробуйте@Inject
вместо@EJB
, если вы хотите, чтобы CDI выполнял эту работу (в этом bean-компоненте@SessionScoped
). - person Siliarus   schedule 13.12.2017ManagedBean
иSessionScoped
? - person John Ament   schedule 14.12.2017