Java EJB3.0JNDI查找(WebLogic10.x)
我使用WebLogic10.3.6和EJB3.0。我有EJB和本地接口。两者都打包在ear内部的ejb jar中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-
@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.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");