Имя JEE6 Global JNDI и развертывание Maven - PullRequest
3 голосов
/ 10 мая 2010

У меня возникли некоторые проблемы с глобальными именами JNDI моих EJB-ресурсов, которые (или, по крайней мере, будут) приводят к сбою при поиске JNDI. Проект разрабатывается на Netbeans и представляет собой стандартное веб-приложение Maven. Когда мое приложение развернуто на GF3.0, имя приложения устанавливается примерно так:

com.example_myapp_war_1.0-ПАНОРАМА

, что хорошо с точки зрения Netbeans, поскольку обеспечивает уникальность имени, но также означает, что все EJB-компоненты получают глобальные имена, такие как:

Java: глобальный / com.example_myapp_war_1.0-ПАНОРАМА / CustomerService

Это, конечно, вызовет проблемы, потому что каждый раз, когда версия меняет все глобальные имена, меняются (я проверял это, изменяя версию, и имена действительно менялись). Имя генерируется из файла POM, и это конкатенация:

<groupId>com.example</groupId>
<artifactId>myapp</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>

До сих пор мне удавалось просто вводить все ресурсы с помощью @EJB, но теперь мне нужно получить доступ к EJB CustomerService из JSF-конвертера, поэтому я выполняю JNDI, который выглядит так:

try {
    Context ctx = new InitialContext();
    CustomerService customerService = (CustomerService)ctx.lookup( "java:global/com.example_myapp_war_1.0-SNAPSHOT/CustomerService" );
    return customerService.get(submittedValue);
} catch( Exception e ) {
    logger.error( "Failed to convert customer.", e );
    return null;
}

, который явно сломается при правильном выпуске приложения и изменении имени модуля. Итак, вопрос на миллион долларов: как мне установить имя модели в maven или как восстановить имя модуля , чтобы я мог программно построить имя JNDI в runtile. Я попытался установить его в файле web.xml, как предлагается по этой ссылке, но он был проигнорирован. Я думаю, что лучше построить имя во время выполнения, поскольку это означает, что при развертывании приложения меньше возможностей для ошибок.

Большое спасибо за любую помощь, я целый день рвал на себе волосы.

Ответы [ 2 ]

3 голосов
/ 10 мая 2010

Если EJB включен в WAR, просто используйте псевдоним java: module:

java:module/CustomerService
0 голосов
/ 10 мая 2010

как установить имя модели в maven или как восстановить имя модуля, чтобы можно было программно построить имя JNDI во время выполнения.

Ну, как написано в предоставленной ссылке, о module-name из Portable Global JNDI name в EJB 3.1 :

<module-name> по умолчанию используется имя пакета (.war или .jar) без расширения пакета.

Поэтому я бы настроил Maven и установил finalName, чтобы не включать версию в название WAR:

<project>
  ...
  <build>
    <finalName>${artifactId}</finalName>
    ...
  </build>
</project>

Не уверен, почему NetBeans включает имя пакета и подчеркивание (NetBeans делает это, верно?) При развертывании на GlassFish, и если вы можете избежать этого, сделайте NB.

...