У меня возникли некоторые проблемы с глобальными именами 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, как предлагается по этой ссылке, но он был проигнорирован. Я думаю, что лучше построить имя во время выполнения, поскольку это означает, что при развертывании приложения меньше возможностей для ошибок.
Большое спасибо за любую помощь, я целый день рвал на себе волосы.