1

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

  1. 这是一个 EJB3
  2. 类 AddressFacade
  3. 实现 AddressFacadeRemote
  4. 它在 ejb-jar (MyJAR.jar) 中
  5. 它在 EAR (MyEAR) 中。

我的应用程序服务器 (Weblogic) 生成了这个名称 (jndiName/mappedName):

MyEARMyJAR_jarAddressFacade_AddressFacadeRemote

我不能使用注入,所以我将使用这个名称进行查找。

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

4

1 回答 1

2

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

JNDI 名称在 Java EE 5 中没有标准化,并且会从一个应用服务器更改为另一个。Adam Bien 写了一篇很好的文章来说明这一点:

EJB 3 可移植性问题:为什么 JNDI 名称没有标准化?

正如我在上一篇文章中提到的,Java EE 5 应用程序的可移植性比旧的 J2EE 1.4 世界要好得多。我发现了一个问题,这需要付出一些努力——缺乏定义和统一的 JNDI 命名和寻址。glassfish 应用程序服务器默认使用远程业务接口的 完全限定名称。JBoss 应用服务器使用以“/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 和 Java EE 5

在 Java EE 6 中,事情得到了解决,我们终于有了Portable Global JNDI Names

于 2010-09-11T07:22:03.730 回答