【问题标题】:Possible JNDI lookups within EJB containerEJB 容器中可能的 JNDI 查找
【发布时间】:2013-02-21 12:31:18
【问题描述】:

我正在查看EJB 3.1 spec,并试图掌握可以进行 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 引用吗?

【问题讨论】:

标签: java jakarta-ee ejb-3.0 jndi ejb-3.1


【解决方案1】:

我通常使用@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

【讨论】:

    【解决方案2】:

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

    默认情况下,注入的会话上下文“定位”在 java:comp 上,因此您可以引用 java:comp 中可用的内容,而无需提供“完整路径”。

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

    我不是 100% 确定您对嵌入式环境的含义,但如果您执行 JNDI 查找的代码不是任何预定义范围的一部分(如 java:module、java:app 等)只有 java:global 可以移植使用。

    【讨论】:

      猜你喜欢
      • 2015-01-25
      • 2014-05-08
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多