2013-03-06 68 views
2

我正在通过EJB 3.1 spec,并试图掌握JNDI调用的不同可能方式。EJB容器内可能的JNDI查找

您可以使用SessionContextInitialContext(或基于Initial-或SessionContext的自创环境)来完成。 基于你使用的语法不同,但我似乎无法找到它背后的逻辑。

所以我的问题是:什么时候可以使用什么语法来在EJB容器环境中使用JNDI调用?

这个问题的其余部分只是为了说明我的观点。

例如,我相信这是总是能正确注射sessioncontext或创建initialcontext

ctx.lookup(java:global[/<app-name>]/<module-name>/<bean-name>[!<fully-qualified-interface-name>]) 
ctx.lookup(java:comp/env ...) 
// special ones like these 
ctx.lookup("java:comp/UserTransaction"); 
ctx.lookup("java:comp/ORB"); 

有时(仅适用于会话上下文?)这个较短的版本是可能的:

ctx.lookup(<bean-name>); 

embedded environment中怎么样,只能使用global引用?

+0

我建议您阅读本文的所有5个部分(http://thegreyblog.blogspot.com/2010/09/introduction-to-ejb-30-injection-and.html)博客条目。 – Arek 2013-03-11 21:51:45

+0

非常有帮助,谢谢! – Steven 2013-03-13 09:15:10

回答

2

我通常使用@EJB注释在EJB容器内注入EJB。因此,JDNI查找由服务器在部署时完成。

例如JBOSS部署:

INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor](MSC服务线程1-2)JNDI绑定用于部署单元子部署命名testBean这个会话bean“MyEJB部署“MyProject.ear”的“.jar”如下所示:

java:global/MyProject/MyEJB/TestBean!my.project.TestBean 
java:app/MyEJB/TestEJB!my.project.TestBean 
java:module/TestEJB!my.project.TestBean 
java:global/MyProject/MyEJB/TestEJB 
java:app/MyEJB/TestBean 
java:module/TestBean 

一些是根据EJB规范,一些是依赖于应用程序服务器的。

如果您必须从上下文中查找,我认为最好的方法是使用java:global

您还可以找到一些额外的信息:http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#POJOLocalEJB

2

JNDI有点像一个文件系统。您可以根据您在树中的位置(您“cd”到的位置)使用相对路径来引用事物。

注入的会话上下文默认情况下是“定位”在java:comp上的,所以你可以参考java:comp中提供的东西,而不需要提供“完整路径”。

请注意,java:comp本身是相对于单个EJB bean,或者是由于整个Web模块的历史原因。

我并不是100%确定你对嵌入式环境的意义,但是如果你从事的JNDI查找代码不是任何预定义范围的一部分(如java:module,java:app等)只有java:global可以被轻易使用。