我正在浏览EJB 3.1 spec,并试图掌握JNDI呼叫的不同可能方式。
您可以使用SessionContext和InitialContext(或基于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 :(得分:2)
我通常使用@EJB注释在EJB容器中注入EJB。因此,JDNI查找是由服务器在部署时完成的。
例如JBOSS部署:
INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor](MSC服务线程1-2)部署“MyProject.ear”的部署单元子部署“MyEJB.jar”中名为TestBean的会话Bean的JNDI绑定如下:
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
找到一些其他信息答案 1 :(得分:2)
jndi有点像文件系统。您可以根据您在树中的位置(“cd”-ed to)来使用相对路径引用事物。
默认情况下,注入的会话上下文“定位”在java:comp上,因此您可以引用java:comp中可用的内容,而无需提供“完整路径”。
请注意,java:comp本身相对于单个EJB bean,或者由于历史原因而导致整个Web模块。
我不是100%确定您对嵌入式环境的意思,但是如果您进行JNDI查找的代码不是任何预定义范围的一部分(例如java:module,java:app等)只有java:global才能被移植使用。