我正在尝试注入一个位于不同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。
溶剂用于将罐子添加到耳朵中并添加含有application.xml的META-INF,如下所示:
<application xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/application_1_4.xsd"
version="1.4">
<display-name>Simple example of application</display-name>
<module>
<ejb>ejb1.jar</ejb>
</module>
<module>
<ejb>ejb2.jar</ejb>
</module>
</application>
我还必须通过在类之前添加耳朵名称来更改我为匹配新结构而进行的一些JNDI查找:“ear-name / bean”
在此之后我只是将罐子放入耳中,所有部署都很好。
答案 0 :(得分:1)
您需要声明本地接口,以便让JBoss仅基于接口查找bean(假设您使用的是EJB 3.0):
@Stateless(name = "Bean")
@Local ( IBeanLocal.class )
@Remote ( IBean.class )
public class Bean implements IBean, IBeanLocal { ... }
编辑:IBean是一个远程接口(请参阅注释)。
答案 1 :(得分:0)
尝试使用@EJB(beanName = "Bean")
不确定它是否有效,但我们遇到了类似的问题,这是由于缺少beanName
属性造成的。