我编写了一个非常简单的应用程序,但CDI没有按预期工作:
定义
@EJB private CustomerProviderSessionBeanLocal customerProvider;
不会导致bean的实例。
我的无状态会话bean的定义
@Local
public interface CustomerProviderSessionBeanLocal { ... }
@Stateless
@EJB(name="ejb/CustomerProvider", beanInterface = CustomerProviderSessionBeanLocal.class, beanName = "CustomerProviderSessionBean")
public class CustomerProviderSessionBean implements
CustomerProviderSessionBeanLocal ...
Controller Bean(用于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");
在@ EJB-annotation中使用相同的JNDI-Name不起作用
我还没有改变野生动物配置!
有人可以帮忙吗?
答案 0 :(得分:0)
我在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)
看起来您的JSF控制器正在使用JSF托管bean功能而不是CDI。在这种情况下,@EJB
将无法正常运行。你应该像这样声明你的类:
@javax.inject.Named
@javax.enterprise.context.SessionScoped
public class BackingBean {
@EJB
private CustomerProviderSessionBeanLocal customerProvider;
}