有人能告诉我在哪里可以找到有关 EJB 3 的默认 JNDI 命名的信息吗?
Weblogic 是否使用像 Glassfish 这样的可移植 JNDI 名称?
我能否找到(如 Glassfish)使用 JNDI 名称的 EJB 部署的踪迹?
例如:
- 只有@Remote 的接口(interface)(服务)
- 一个只有@Stateless 实现接口(interface)的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)
附言。有了 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");
正在工作。
最佳答案
不幸的是,EJB 3.0 没有指定标准的 JNDI 命名并将其留给服务器供应商。引用有关 mappedName 的 WL 文档是正确的:“如果指定此属性,则无状态 session 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
关于ejb-3.0 - Weblogic 10.3.5 和 EJB 3 JNDI 名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14872141/