【问题标题】:The mappedName is always the same across application servers?跨应用程序服务器的 mappedName 始终相同?
【发布时间】:2010-09-10 15:19:58
【问题描述】:

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

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

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

MyEARMyJAR_jarAddressFacade_AddressFacadeRemote

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

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

【问题讨论】:

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


    【解决方案1】:

    问题是:如果我保持相同的 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 应用程序服务器使用 fully qualified name 的 默认为远程业务接口。 JBoss 应用服务器使用 以“/remote”结尾的 EJB。所以 以下会话 Bean:

    package com.abien;
    
    @Stateless
    public class HelloWorldBean implements HelloWorld {
    
        public String sayHello(String hello){
            return "Echo from server: ";
        }
    }
    

    可以在 JBoss 中找到(使用 EJB3 支持)使用以下 代码-sn-p:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多