Java @EJB从不同的jar注入
我尝试注入一个位于不同jar文件中的bean,然后是我尝试注入它的bean。这两个bean都只是带有本地和远程接口的基本@Stateless bean。 如果我使用正常的注射Java @EJB从不同的jar注入,java,jboss,ejb,Java,Jboss,Ejb,我尝试注入一个位于不同jar文件中的bean,然后是我尝试注入它的bean。这两个bean都只是带有本地和远程接口的基本@Stateless bean。 如果我使用正常的注射 @EJB IBean injectedBean; 或 在部署应用程序时,我得到一个NullPointerException 如果我使用: @EJB(mappedName="Bean") IBean injectedBean; 或 一切正常,JBoss不会抛出部署错误 我可能会提到我使用JBoss5 我注入的bean类声
@EJB
IBean injectedBean;
或
在部署应用程序时,我得到一个NullPointerException
如果我使用:
@EJB(mappedName="Bean")
IBean injectedBean;
或
一切正常,JBoss不会抛出部署错误
我可能会提到我使用JBoss5
我注入的bean类声明为:
@Remote
public interface IBean
@Local
public interface IBeanLocal extends IBean
@Stateless(name = "Bean")
public class Bean implements IBean, IBeanLocal
我的问题是,正如文档中指定的,mappedName属性是特定于供应商的。我还有别的办法让它工作吗
已解决:
我设法解决了这个问题
问题是我试图分别部署这两个JAR,这意味着每个JAR都会在JBoss中获得自己的类加载器,这样它们就找不到彼此,并且在尝试注入bean时会返回NullPointerException
解决方案是将JAR添加到ear中,并添加包含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>
应用程序的简单示例
ejb1.jar
ejb2.jar
我还必须通过在类“ear name/bean”之前添加ear名称来更改一些JNDI查找以匹配新结构
在这之后,我只是将JAR添加到ear中,所有的东西都部署得很好。您需要声明本地接口,以便JBoss仅基于接口找到bean(假设您使用的是EJB3.0):
编辑:IBean是一个远程接口(请参阅注释)。尝试使用
@EJB(beanName=“bean”)
不确定它是否能工作,但我们遇到了类似的问题,原因是缺少
beanName
属性。很抱歉,我忘了提到IBean是一个远程接口,IBeanLocal扩展了IBean,是一个本地接口。但是,xml根声明是错误的。您应该使用与JavaEE5兼容的版本,而不是J2EE1.4版本。感谢您指出这一点。下面是一个Java EE 5和6的application.xml示例:您能给出一个关于“ear名称/bean”的示例代码吗?
@Remote
public interface IBean
@Local
public interface IBeanLocal extends IBean
@Stateless(name = "Bean")
public class Bean implements IBean, IBeanLocal
<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>
@Stateless(name = "Bean")
@Local ( IBeanLocal.class )
@Remote ( IBean.class )
public class Bean implements IBean, IBeanLocal { ... }