在Glassfish上的EAR文件中查找EJB3的JNDI

时间:2009-10-06 06:53:01

标签: java ejb-3.0 jndi local

我有一个包含大量JAR的EAR文件,其中一个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的本地业务与远程业务指定未解析的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

时出错

5 个答案:

答案 0 :(得分: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() + ")");
  }
}

答案 1 :(得分: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)来进行此类查找。

答案 2 :(得分:2)

我认为EJB 3 Portability Issue博客文章可以为您提供帮助。

答案 3 :(得分:0)

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

1)UnmanagedClass1 - &gt; UnmanagedClass2 - &gt; UnmanagedClass3 - &gt; MyPOJO
2)ManagedClass - &gt; UnmanagedClass2 - &gt; UnmanagedClass3 - &gt; MyPOJO

答案 4 :(得分: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