我有一个带有一些属性的无状态bean:
我的应用程序服务器(Weblogic)生成了这个名称(jndiName / mappedName):
MyEARMyJAR_jarAddressFacade_AddressFacadeRemote
我无法使用注射,因此我将使用此名称进行查找。
问题是:如果我保持相同的EAR,JAR,类和接口名称,这个名字总是一样的吗?或者它可以从应用程序服务器更改?
答案 0 :(得分:2)
问题是:如果我保持相同的EAR,JAR,类和接口名称,这个名称总是一样的吗?或者它可以从应用程序服务器更改?
JNDI名称在Java EE 5中未标准化,并且将从一个应用程序服务器更改为另一个应用程序服务器。 Adam Bien写了一篇很好的文章说明了这一点:
EJB 3 Portability Issue: why JNDI names are not standardized?
正如我在上一篇文章中提到的, Java EE 5的可移植性 应用程序要好得多 旧的J2EE 1.4世界。我发现了一个 问题,这会导致一些努力 - 缺乏明确和统一的 JNDI命名和寻址。该 glassfish applicationsserver使用 fully qualified name 远程业务接口默认。 JBoss appserver使用的名称为 具有“/ remote”结尾的EJB。所以 以下会话Bean:
package com.abien; @Stateless public class HelloWorldBean implements HelloWorld { public String sayHello(String hello){ return "Echo from server: "; } }
可以在JBoss中找到(使用EJB3 支持)使用以下内容 代码片断:
Context context = new InitialContext(); HelloWorld helloWorld = (HelloWorld) context.lookup("myEarName/HelloWorldBean/remote");
和Glassfish(v1和v2),使用 完全限定的名称 远程业务接口:
Context context = new InitialContext(); HelloWorld helloWorld = (HelloWorld) context.lookup(HelloWorld.class.getName());
处理此问题的一个不错的方法是使用ServiceLocator
和“可插入”应用程序服务器特定策略。请查看ServiceLocator, JNDI Naming Helper and Java EE 5。
在Java EE 6中,事情是固定的,我们最终得到Portable Global JNDI Names。