在应用程序服务器中,mappedName始终是相同的?

时间:2010-09-10 15:19:58

标签: java-ee ejb-3.0 jndi application-server

我有一个带有一些属性的无状态bean:

  1. 这是一个EJB3
  2. class AddressFacade
  3. 实现AddressFacadeRemote
  4. 它在ejb-jar(MyJAR.jar)
  5. 它在EAR(MyEAR)中。
  6. 我的应用程序服务器(Weblogic)生成了这个名称(jndiName / mappedName):

    MyEARMyJAR_jarAddressFacade_AddressFacadeRemote
    

    我无法使用注射,因此我将使用此名称进行查找。

    问题是:如果我保持相同的EAR,JAR,类和接口名称,这个名字总是一样的吗?或者它可以从应用程序服务器更改?

1 个答案:

答案 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