Jakarta ee WildFly 11:CDI不起作用
我编写了一个非常简单的应用程序,但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
@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)文件的情况下使其工作。就是把下面的罐子加到你的耳朵里
如果您通过“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;
}