Dependency injection 通过远程接口将单例bean注入会话bean,对象始终为;空";

Dependency injection 通过远程接口将单例bean注入会话bean,对象始终为;空";,dependency-injection,ejb,jboss7.x,Dependency Injection,Ejb,Jboss7.x,我需要向会话bean中注入一个单例bean。下面是相应的类。问题是注入的对象总是空的。我尝试了JBoss 7.0.1服务器在启动期间向我显示的所有JNDI查找字符串(即部署的部署单元子部署中名为GlobalBean的会话bean的JNDI绑定如下:…)。我还尝试注释GlobalBean.java中的@EJB注释,并尝试在注入期间使用“EJB/GlobalBean”。然而,没有运气。原因可能是什么?Thx GlobalBean.java: @Startup @Singleton @Remote(G

我需要向会话bean中注入一个单例bean。下面是相应的类。问题是注入的对象总是空的。我尝试了JBoss 7.0.1服务器在启动期间向我显示的所有JNDI查找字符串(即部署的部署单元子部署中名为GlobalBean的会话bean的JNDI绑定如下:…)。我还尝试注释GlobalBean.java中的@EJB注释,并尝试在注入期间使用“EJB/GlobalBean”。然而,没有运气。原因可能是什么?Thx

GlobalBean.java:

@Startup
@Singleton
@Remote(GlobalBeanRemote.class)
@EJB(name="ejb/GlobalBean", beanName="GlobalBean", beanInterface=GlobalBeanRemote.class)  
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
public class GlobalBean implements GlobalBeanRemote
{
   // CODE
}
@Stateful
public class SessionBean extends ParentBean
{
      @EJB(name="java:module/GlobalBean!project.framework.interfaces.GlobalBeanRemote")
      private GlobalBeanRemote globalBeanAPI3;

      // CODE
}
SessionBean.java:

@Startup
@Singleton
@Remote(GlobalBeanRemote.class)
@EJB(name="ejb/GlobalBean", beanName="GlobalBean", beanInterface=GlobalBeanRemote.class)  
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
public class GlobalBean implements GlobalBeanRemote
{
   // CODE
}
@Stateful
public class SessionBean extends ParentBean
{
      @EJB(name="java:module/GlobalBean!project.framework.interfaces.GlobalBeanRemote")
      private GlobalBeanRemote globalBeanAPI3;

      // CODE
}

在SessionBean类中,尝试将@EJB的name属性更改为mappedName

@EJB(mappedName="java:module/GlobalBean!project.framework.interfaces.GlobalBeanRemote")
当然,这只有在两个bean位于同一个模块中时才起作用

更新 假设您的bean位于不同的模块中,请尝试使用java:app名称空间:

@EJB(mappedName="java:app ...")
java:app名称空间用于查找打包在同一应用程序中的本地企业bean。也就是说,企业bean打包在包含多个javaee模块的EAR文件中。使用java:app命名空间的JNDI地址的格式如下:

java:app[/module name]/enterprisebean name[/interface name]


还可以尝试删除GlobalBean的@EJB注释@EJB用于定义依赖项。

这样做给了我一个运行时错误:org.jboss.msc.service.DuplicateServiceException:service jboss.naming.context.java.app。“Project”。Project-modules-global-EJB.GlobalBean已注册。另外,它们在单独的模块中。按照您的建议进行了操作,现在在启动过程中没有出现错误,但引用仍然为空。您没有在SessionBean的构造函数中引用globalBeanAPI3,是吗?通过使用InitialContext和查找解决了此问题。是的,我是。:-)哦,不,注入的字段是否只有在构造函数完成后才初始化?确切地说:)必须先创建对象,然后容器才能向其中注入任何内容。如果您想进行一些初始化,只需添加一个带有@PostConstruct的方法。在构造后注释的方法中,注入的字段将可用(如果注入成功)。