6

我有一个 EAR 文件,其中包含一堆 JAR,其中一个 JAR 包含本地会话 Bean (EJB3)。我需要从非托管 POJO 中执行这些会话 Bean 的 JNDI 查找,该 POJO 也包含在 EAR 中(在这种情况下,也包含在与 EJB 相同的 JAR 中)。我尝试按照Glassfish EJB FAQ进行操作,但无论我尝试什么,我都会继续收到 javax.naming.NameNotFoundException。

我不确定一些事情。我应该把我的 ejb-jar.xml 放在哪里(我尝试了 EARs META-INF 以及 JARs META-INF)?我需要 sun-ejb-jar.xml 吗?ejb-link到底是什么,它有什么作用?我可能做错了什么(我的配置与本地查找常见问题解答中给出的配置几乎相同)?

我列出了一些我尝试过的配置以及下面的结果:

<enterprise-beans>
  <session>
    <ejb-name>ITestBean</ejb-name>
    <ejb-class>com.test.TestBean</ejb-class>
    <ejb-local-ref>
      <ejb-ref-name>ITestBean</ejb-ref-name>
      <local>com.test.ITestBean</local>
    </ejb-local-ref>
  </session>
 </enterprise-beans>

应用程序部署但 JNDI 查找返回 null。

<enterprise-beans>
  <session>
    <ejb-name>ITestBean</ejb-name>
    <ejb-class>com.test.TestBean</ejb-class>
    <ejb-local-ref>
      <ejb-ref-name>ITestBean</ejb-ref-name>
      <local>com.test.ITestBean</local>
      <ejb-link>ITestBean</ejb-link>
    </ejb-local-ref>
  </session>
 </enterprise-beans>

应用程序未部署:无法确定 EJB 3.0 ref Unresolved Ejb-Ref ITestBean@jndi 的本地业务与远程业务指定。

<enterprise-beans>
  <session>
    <ejb-name>ITestBean</ejb-name>
    <ejb-class>com.test.TestBean</ejb-class>
    <ejb-local-ref>
      <ejb-ref-name>ITestBean</ejb-ref-name>
      <local>com.test.ITestBean</local>
      <ejb-link>MyJar.jar#ITestBean</ejb-link>
    </ejb-local-ref>
  </session>
 </enterprise-beans>

应用程序未部署:错误:未解决:MyJar.jar#ITestBean。

<enterprise-beans>
  <session>
    <ejb-name>ITestBean</ejb-name>
    <local>com.test.ITestBean</local>
    <ejb-local-ref>
      <ejb-ref-name>ITestBean</ejb-ref-name>
    </ejb-local-ref>
  </session>
 </enterprise-beans>

处理 EjbDescriptor 时出错

4

5 回答 5

9

您也可以随时在 System.out 或日志中转储 InitialContext 中的所有名称。

//Get all the names in the initial context
NamingEnumeration children = initialContext.list("");

while(children.hasMore()) {
    NameClassPair ncPair = (NameClassPair)children.next();
    System.out.print(ncPair.getName() + " (type ");
    System.out.println(ncPair.getClassName() + ")");
  }
}
于 2009-10-07T10:22:22.813 回答
2

ejb 文件的 ejb-jar.xml 进入 META-INF(EJB-Jar 的,而不是耳朵的)。部署描述符中的 EJB Refs 如下所示:

<ejb-local-ref>
    <ejb-ref-name>EJBName</ejb-ref-name>
    <ejb-ref-type>Session</ejb-ref-type>
    <local>classname</local>
    <ejb-link>JARName.jar#EJBName</ejb-link>
</ejb-local-ref>

查找代码如下所示:

Context c = new InitialContext();
return (EJBLocalInterface) c.lookup("java:comp/env/EJBName");

我认为您不需要容器特定的部署描述符 (sun-ejb-jar.xml) 来进行此类查找。

于 2009-10-06T13:57:02.457 回答
2

我认为EJB 3 可移植性问题博客文章应该对您有所帮助。

于 2009-10-06T14:45:53.580 回答
0

不可能从 POJO 执行 bean 的 JNDI 查找,除非从托管类(例如会话 bean)调用(直接或间接)该 POJO。换句话说,第一个示例不起作用,而第二个示例将起作用(假设 MyPOJO 是尝试执行 JNDI 查找的类):

1) UnmanagedClass1 -> UnmanagedClass2 -> UnmanagedClass3 -> MyPOJO
2) ManagedClass -> UnmanagedClass2 -> UnmanagedClass3 -> MyPOJO

于 2009-11-02T11:50:13.850 回答
0

我正在研究 glassfish v2,当从 EJB3 调用 JSNI 时,我只需要 ejb-jar.xml,而不是 sun-ejb-jar.xml

<ejb-jar xmlns = "http://java.sun.com/xml/ns/javaee" 
     version = "3.0" 
     xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd">

         <enterprise-beans>

             <session>
                 <ejb-name>TestBean1</ejb-name>
                 <ejb-local-ref>
                    <ejb-ref-name>ejb/TestLocal</ejb-ref-name>
                    <ejb-ref-type>Session</ejb-ref-type>
                    <local>com.clients.TestLocal</local>
                    <mapped-name>ejb/TestLocal</mapped-name>
                </ejb-local-ref>
                 <ejb-local-ref>
                    <ejb-ref-name>ejb/Test2Local</ejb-ref-name>
                    <ejb-ref-type>Session</ejb-ref-type>
                    <local>com.clients.Test2Local</local>
                    <mapped-name>ejb/Test2Local</mapped-name>
                </ejb-local-ref>
              <session>
        <enterprise-beans>

@Stateless(mappedName="ejb/TestLocal")
public class TestBean1 implements TestLocal

@Stateless(mappedName="ejb/Test2Local")
public class TestBean2 implements Test2Local

在 TestBean1 中调用服务定位器为

ic.lookup("java:comp/env/ejb/Test2Local");

将返回 Test2Bean

于 2010-06-26T01:52:41.453 回答