0

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

控制器 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 不起作用

我没有更改wildfly配置!

任何人都可以帮忙吗?

4

2 回答 2

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
于 2019-05-16T14:03:34.187 回答
-2

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

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

    @EJB 
    private CustomerProviderSessionBeanLocal customerProvider;

}
于 2017-12-22T09:29:59.167 回答