@EJB从不同的jar注入
我正在尝试注入一个位于不同jar文件中的bean然后我正在尝试将其注入其中。 这两个bean都只是具有本地和远程接口的基本@Stateless bean。 如果我使用正常注射
@EJB IBean injectedBean;
要么
@EJB IBeanLocal injectedBean;
部署应用程序时,我得到一个NullPointerException。
如果我使用:
@EJB(mappedName="Bean") IBean injectedBean;
要么
@EJB(mappedName="Bean") IBeanLocal injectedBean;
一切正常,JBoss不会抛出任何部署错误。
我可能会提到我使用JBoss 5。
我正在注入的bean类被声明为:
@Remote public interface IBean @Local public interface IBeanLocal extends IBean @Stateless(name = "Bean") public class Bean implements IBean, IBeanLocal
我的问题是,如文档中所指定,mappedName属性是特定于供应商的。 有没有其他方法我可以让这个工作?
解决了:
我设法解决了这个问题。
问题是我试图单独部署两个jar,这意味着每个人都会在JBoss中获得它自己的ClassLoader,这样他们就无法找到对方并在尝试注入bean时返回NullPointerException。
解决方案是将jar子添加到耳朵并添加包含application.xml的META-INF,如下所示:
Simple example of application ejb1.jar ejb2.jar
我还必须通过在类之前添加ear名称来更改我为匹配新结构而进行的一些JNDI查找:“ear-name / bean”
在此之后,我只是将jar子添加到耳朵,所有部署都很好。
您需要声明本地接口,以便让JBoss仅基于接口查找bean(假设您使用的是EJB 3.0):
@Stateless(name = "Bean") @Local ( IBeanLocal.class ) @Remote ( IBean.class ) public class Bean implements IBean, IBeanLocal { ... }
编辑:IBean是一个远程接口(请参阅注释)。
尝试用@EJB(beanName = "Bean")
注入你的bean @EJB(beanName = "Bean")
不确定它是否可行,但是我们遇到了类似的问题,这是由缺少beanName
属性引起的。