WildFly 11:CDI不起作用

时间:2017-12-13 12:17:31

标签: java-ee jboss cdi wildfly-11

我编写了一个非常简单的应用程序,但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不起作用

我还没有改变野生动物配置!

有人可以帮忙吗?

2 个答案:

答案 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. cdi-api-1.2.jar

答案 1 :(得分:-2)

看起来您的JSF控制器正在使用JSF托管bean功能而不是CDI。在这种情况下,@EJB将无法正常运行。你应该像这样声明你的类:

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

    @EJB 
    private CustomerProviderSessionBeanLocal customerProvider;

}