Java EJB3.0JNDI查找(WebLogic10.x)

Java EJB3.0JNDI查找(WebLogic10.x),java,jakarta-ee,ejb-3.0,jndi,weblogic-10.x,Java,Jakarta Ee,Ejb 3.0,Jndi,Weblogic 10.x,我使用WebLogic10.3.6和EJB3.0。我有EJB和本地接口。两者都打包在ear内部的ejb jar中 @Local public interface TestLocal { ... } @Stateless public class TestEJB implements TestLocal { ... } 要从war访问此EJB,我在web.xml <ejb-local-ref> <ejb-ref-name>ejb/TestLocal</ejb-

我使用WebLogic10.3.6和EJB3.0。我有EJB和本地接口。两者都打包在ear内部的ejb jar中

@Local
public interface TestLocal {
...
}

@Stateless
public class TestEJB implements TestLocal {
...
}
要从war访问此EJB,我在
web.xml

<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>  
<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>
一切正常。现在我需要从它打包的同一个EJB jar调用这个EJB。但是我一直都有
javax.naming.NameNotFoundException
。我已经尝试过的:

  • ejb jar(非ear)中的
    ejb jar.xml

  • weblogicejbjar.xml中

    <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>  
    
    <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>
    
    
    测试员
    测试员
    测试员
    真的
    
  • weblogicejbjar.xml
    ejbjar.xml

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

    你知道我做错了什么吗?

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

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

    JNDI查找名称总是
    java:comp/env/

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

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

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


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

    在同一应用程序中查找JNDI时,为什么要使用JNDI?您只需要通过@EJB注入它。我不能使用@EJB,因为我需要来自POJO的引用
      TestLocal testLocal = (TestLocal) new InitialContext().lookup("java:comp/env/TestEJB");