EJB 3.0 JNDI查找(Weblogic 10.x)

时间:2015-03-05 23:01:12

标签: java java-ee ejb-3.0 jndi weblogic-10.x

我使用weblogic 10.3.6等EJB 3.0。我有EJB和本地接口。两者都装在耳内的ejb-jar中。

@Local
public interface TestLocal {
...
}

@Stateless
public class TestEJB implements TestLocal {
...
}

要从我在web.xml

中的战争中访问此EJB
<ejb-local-ref>
  <ejb-ref-name>ejb/TestLocal</ejb-ref-name>
  <ejb-ref-type>Session</ejb-ref-type>
  <local>testpackage.TestLocal</local>
</ejb-local-ref>  

查找看起来像

test = (TestLocal) new InitialContext().lookup("java:comp/env/ejb/TestLocal");

一切正常。现在我需要从它打包的同一个ejb-jar中调用这个EJB。但我一直javax.naming.NameNotFoundException。我已经尝试过了:

  1. 在ejb-jar中的ejb-jar.xml(不是耳朵)

    <ejb-name>TestEJB</ejb-name>
    <ejb-local-ref>
      <ejb-ref-name>TestEJB</ejb-ref-name>
      <ejb-ref-type>Session</ejb-ref-type>
      <local>testpackage.TestLocal</local>
      <ejb-link>myjar.jar#TestEJB</ejb-link>
    </ejb-local-ref>
    
  2. 以及以下查找

     initialContext.lookup("java:comp/env/TestEJB");
     initialContext.lookup("TestEJB");
    
    1. weblogic-ejb-jar.xml

      <weblogic-enterprise-bean>
       <ejb-name>TestEJB</ejb-name>
       <jndi-name>TestEJB</jndi-name>
       <local-jndi-name>TestEJB</local-jndi-name>
       <enable-call-by-reference>True</enable-call-by-reference>
      </weblogic-enterprise-bean>
      
    2. weblogic-ejb-jar.xmlejb-jar.xml

    3. 您对我做错了什么有任何想法吗?

1 个答案:

答案 0 :(得分:0)

Java EE中的JNDI具有不同的命名空间。在Java EE 6之前,通常只有“全局”命名空间和“组件环境”命名空间。

每个EJB都有自己的组件环境。 Web应用程序也有自己的组件环境。当您使用前缀为java:comp/env的JNDI名称时,这就是您正在查找的内容。通过部署描述符(ejb-jar.xml和web.xml)将对象添加到组件环境中:

    <ejb-name>TestEJB</ejb-name>
    <ejb-local-ref>
         <ejb-ref-name>TestEJB</ejb-ref-name>
         <ejb-ref-type>Session</ejb-ref-type>
         <local>testpackage.TestLocal</local>
         <ejb-link>myjar.jar#TestEJB</ejb-link>
    </ejb-local-ref>
    ...

因此,在TestEJB的调用上下文中,您将查找上面的引用:

  TestLocal testLocal = (TestLocal) new InitialContext().lookup("java:comp/env/TestEJB");

JNDI查找名称始终为java:comp/env/<ejb-ref-name>

你可以看到这实际上正在查找自己的另一个实例,因为这是你在上面声明的。 这可能不是你想要的。

鉴于上述情况,您问题的答案取决于您的POJO的调用情境。

如果是webapp - &gt; POJO - &gt; TestEJB,那么你应该使用webapp的组件环境并查找“java:comp / env / ejb / TestLocal”。

如果是webapp - &gt; SomeEJB - &gt; TestEJB,然后你需要向SomeEJB添加一个组件环境(不是你的示例中的TestEJB)并查找你在那里定义的名称。