2

有人能告诉我在哪里可以找到有关 EJB 3 的默认 JNDI 命名的信息吗?

Weblogic 是否使用像 Glassfish 这样的可移植 JNDI 名称?

我可以找到(例如 Glassfish)使用 JNDI 名称的 EJB 部署的痕迹吗?

例如 :

  • 只有@Remote 的接口(服务)
  • 一个只有 @Stateless 实现接口的 bean (ServiceImpl)
  • 打包在.ear文件中的所有内容 (service-application-1.0)

在 Weblogic 上部署时,我看到的唯一 JNDI 参考是:

service-application-1.0service-application-1.0_jarServiceImpl_Home

但我不能在上下文查找中使用该名称。如果我做

Service myService = (Service) context.lookup("service-application-1.0service-application-1.0_jarServiceImpl_Home");

它给了我

Exception in thread "main" java.lang.ClassCastException: weblogic.ejb.container.internal.StatelessEJBHomeImpl_1035_WLStub cannot be cast to com.tuto.Service
at com.tuto.TestEjb.main(TestEjb.java:24)

PS。有了 Glassfish,它给了我

Portable jndi names for .... : java:global/service-application-1.0/service-application-ejb-1.0/ServiceImpl

Service myService = (Service) context.lookup("java:global/service-application-1.0/service-application-ejb-1.0/ServiceImpl");

正在工作中。

4

2 回答 2

5

不幸的是,EJB 3.0 没有指定标准的 JNDI 命名,而是由服务器供应商决定。引用有关 mappedName 的 WL 文档是对的:“如果指定此属性,则无状态会话 bean 可能不可移植”。mappedName 属性的缺点是全局 JNDI 名称将默认为 mappedName#FullyQualifiedRemoteInterface。由于 mappedName 是源代码中的注释,它使您的代码不可移植。首选方法是将特定于供应商的行为保留在特定于供应商的部署描述符中,例如 weblogic-ejb-jar.xml。这样,您还可以选择指定您自己的自定义 JNDI 名称,而不需要预先确定的格式,如 mappedName#FullyQualifiedRemoteInterface。

EJB 3.1 为在全局、应用程序和模块级别标准化 JNDI 名称做出了一些努力。请参阅http://docs.oracle.com/cd/E19798-01/821-1841/girgn/index.html

于 2013-02-20T06:30:37.910 回答
1

您可以尝试, bean 的映射名称context.lookup("ServiveImpl#com.Service");在哪里,它应该是完全限定的接口名称。ServiveImpl#

于 2013-02-14T10:54:51.203 回答