Java @EJB从不同的jar注入

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类声

我尝试注入一个位于不同jar文件中的bean,然后是我尝试注入它的bean。这两个bean都只是带有本地和远程接口的基本@Stateless 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 { ... }