【问题标题】:EJB 3.0 JNDI lookup (Weblogic 10.x)EJB 3.0 JNDI 查找 (Weblogic 10.x)
【发布时间】:2015-03-05 23:01:12
【问题描述】:

我使用 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.xml 在 ejb-jar 中(不是耳朵)

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

以及后续查找

 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

你对我做错了什么有任何想法吗?

【问题讨论】:

  • 在同一个应用程序中查找 JNDI 时为什么要使用它?你只需要通过@EJB 注入它。
  • 我不能使用@EJB,因为我需要来自 POJO 的参考

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


【解决方案1】:

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

每个 EJB 都有自己的组件环境。 webapp 也有它自己的组件环境。当您使用以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/&lt;ejb-ref-name&gt;

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

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

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

如果是 webapp -> SomeEJB -> TestEJB,那么您需要将组件环境添加到 SomeEJB(而不是您的示例中的 TestEJB)并查找您在此处定义的名称。

【讨论】:

    猜你喜欢
    • 2011-06-10
    • 2013-11-16
    • 2013-02-02
    • 1970-01-01
    • 2013-01-30
    • 2010-09-08
    • 2015-01-25
    • 1970-01-01
    • 2012-09-22
    相关资源
    最近更新 更多