Weblogic 10.3.5& EJB 3 JNDI名称

时间:2013-02-14 09:59:39

标签: ejb-3.0 jndi weblogic11g

有人能告诉我在哪里可以找到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");

正在运作。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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