MappedName всегда одинаково на серверах приложений? - PullRequest
1 голос
/ 10 сентября 2010

У меня есть bean-компонент без состояния с некоторыми свойствами:

  1. Это EJB3
  2. класс AddressFacade
  3. реализует AddressFacadeRemote
  4. это внутри ejb-jar (MyJAR.jar)
  5. это в EAR (MyEAR).

Мой сервер приложений (Weblogic) сгенерировал это имя (jndiName / mappedName):

MyEARMyJAR_jarAddressFacade_AddressFacadeRemote

Я не могу использовать инъекцию, поэтому я сделаю поиск с этим именем.

Вопрос в следующем: это имя всегда будет одинаковым, если я буду поддерживать одинаковые EAR, JAR, Class и имя интерфейса? Или это может измениться с серверов приложений?

1 Ответ

2 голосов
/ 11 сентября 2010

Вопрос в том, что это имя всегда будет одинаковым, если я буду поддерживать одинаковые EAR, JAR, Class и имя интерфейса?Или это может измениться с серверов приложений?

Имена JNDI не стандартизированы в Java EE 5 и будут меняться с одного сервера приложений на другой.Адам Бьен написал хороший пост, иллюстрирующий это:

EJB 3 Проблема переносимости: почему имена JNDI не стандартизированы?

Как я упоминал в моем предыдущем посте,Переносимость приложений Java EE 5 намного лучше, чем в старом мире J2EE 1.4.Я обнаружил одну проблему, которая требует определенных усилий - отсутствие определенного и унифицированного именования и адресации JNDI.Сервер приложений Glassfish по умолчанию использует полное имя удаленного бизнес-интерфейса .Сервер приложений JBoss использует имя EJB с окончанием «/ remote».Таким образом, следующий Session 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 все исправлено, и мы наконец-то имеем Переносимые глобальные имена JNDI .

...