2010-05-10 2 views
2

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

com.example_myapp_war_1.0-SNAPSHOT

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

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

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

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

До сих пор я отделался только инъекционные все ресурсы, используя @EJB, но теперь мне нужно получить доступ к CustomerService EJB из 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 или как восстановить module name, чтобы я мог программно построить имя JNDI в runtile. Я попытался установить его в файле web.xml, как было предложено этой ссылкой, но он был проигнорирован. Я думаю, что я бы предпочел создать имя во время выполнения, поскольку это означает, что при развертывании приложения меньше возможностей для винтов.

Огромное спасибо за любую помощь, я весь день разорвал свои волосы.

+0

Как вы делаете развертывание? грузы? Вы используете военный плагин? – khmarbaise

ответ

3

Если EJB входит в WAR, просто использовать Java: модуль псевдоним:

java:module/CustomerService 
+0

Это получилось, большое спасибо. Для кого-либо, у кого есть эта проблема, дополнительную информацию можно найти здесь: http://blogs.oracle.com/kensaks/entry/application_specified_portable_jndi_names – wobblycogs

+0

Это работает отлично, если вы попытаетесь сделать это из задания кварца. Я предполагаю, что это потому, что Quartz запускает собственные потоки вне контекста контейнера и т. Д. (Кстати, да, мне удалось вручную создать рабочий InitialContext). ТОЛЬКО работает глобальный поиск JNDI. Это означает, что я застрял в установке окончательного имени сборки в maven. Но это НЕ гарантия, так как разработчик может изменить имя развернутого приложения. Кто-нибудь получил что-то лучшее (чтобы все это работало в кварцевой работе?) – demaniak

+0

@demaniak Возможно ли захватить «java: app/AppName» и «java: module/ModuleName» в потоке EE и передать его на Кварцевое задание, которое может перекомпоновать 'java: global///' name? –

0

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

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

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

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

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

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

+0

Извините, я уже пробовал это myapp, и это не помогло. Тем не менее, он остановил версию, включенную во имя войны. Если честно, я не уверен, что это приложение maven или netbeans, которое развертывает приложение с именем «com.example_myapp_war_1.0-SNAPSHOT», но это имя отображается в консоли администратора GF. Я знаю, что части имени взяты из POM, поэтому я предполагаю, что Maven генерирует это имя. Я думаю, что GF запускает приложение из целевого военного каталога, не беря имя военного файла. – wobblycogs

 Смежные вопросы

  • Нет связанных вопросов^_^