我使用weblogic 10.3.6等EJB 3.0。我有EJB和本地接口。两者都装在耳内的ejb-jar中。
@Local
public interface TestLocal {
...
}
@Stateless
public class TestEJB implements TestLocal {
...
}
要从我在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>
查找看起来像
test = (TestLocal) new InitialContext().lookup("java:comp/env/ejb/TestLocal");
一切正常。现在我需要从它打包的同一个ejb-jar中调用这个EJB。但我一直javax.naming.NameNotFoundException
。我已经尝试过了:
在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>
以及以下查找
initialContext.lookup("java:comp/env/TestEJB");
initialContext.lookup("TestEJB");
在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>
weblogic-ejb-jar.xml
和ejb-jar.xml
您对我做错了什么有任何想法吗?
答案 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)并查找你在那里定义的名称。