Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jakarta ee WildFly 11:CDI不起作用_Jakarta Ee_Jboss_Cdi_Wildfly 11 - Fatal编程技术网

Jakarta ee WildFly 11:CDI不起作用

Jakarta ee WildFly 11:CDI不起作用,jakarta-ee,jboss,cdi,wildfly-11,Jakarta Ee,Jboss,Cdi,Wildfly 11,我编写了一个非常简单的应用程序,但CDI并没有按预期工作: 定义 @EJB private CustomerProviderSessionBeanLocal customerProvider; 不会导致bean的实例 我的无状态会话bean的定义 @Local public interface CustomerProviderSessionBeanLocal { ... } @Stateless @EJB(name="ejb/CustomerProvider", beanInterface

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

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查找确实有效:

initialContext = new InitialContext();
Object o = initialContext.lookup("java:app/2017_JEE_App_1_war_exploded/CustomerProviderSessionBean");
在@EJB注释中使用相同的JNDI名称不起作用

我没有改变wildfly的配置


有人能帮忙吗?

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

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

    @EJB 
    private CustomerProviderSessionBeanLocal customerProvider;

}

我用Wildfly 11和J2EE 7实现了这一点。我将以下内容添加到standalone.xml文件中的“全局模块”部分

...

另一种方法是在不更改standalone.xml(或domain.xml)文件的情况下使其工作。就是把下面的罐子加到你的耳朵里

  • cdi-api-1.2.jar

  • 如果您通过“new BackingBean()”创建了BckingBean实例,CDI将无法工作。是吗?支持bean实例是通过JSF访问自动创建的。您正在非常广泛地混合EJB和CDI。首先,CDIBean(
    @SessionScoped BackingBean
    )不需要是
    @ManagedBean
    。其次,如果您想让CDI(在
    @SessionScoped
    bean中)完成这项工作,请尝试
    @Inject
    而不是
    @EJB
    。您是否可以共享
    ManagedBean
    SessionScoped
    的导入?“在这种情况下@EJB无法正常工作”这句话不正确
    @EJB
    在JSF native
    @ManagedBean
    中一直运行良好。唯一不起作用的是
    @Inject
    ,但OP根本没有使用它。OP的问题在目前为止提供的信息中其他地方是看不到的。我猜想OP实际上是在尝试访问bean构造函数中的EJB实例,而不是
    @PostConstruct
    。即使迁移到CDI也不能解决这个问题。谢谢你的澄清。我不知道。
    @javax.inject.Named
    @javax.enterprise.context.SessionScoped
    public class BackingBean {
    
        @EJB 
        private CustomerProviderSessionBeanLocal customerProvider;
    
    }