我的EJB资源的全局JNDI名称存在一些问题,这些问题(或者至少会)导致我的JNDI查找失败。该项目正在Netbeans上开发,是一个标准的Maven Web应用程序。当我的应用程序部署到GF3.0时,应用程序名称设置为:
com.example_myapp_war_1.0-SNAPSHOT
从Netbeans的角度来看,这一切都很好,因为它确保名称是唯一的,但它也意味着所有的EJB都获得如下全局名称:
的java:全球/ com.example_myapp_war_1.0-SNAPSHOT /的CustomerService
这当然会导致问题,因为每次版本更改时,所有全局名称都会发生变化(我通过更改版本测试了这一点,并确实更改了名称)。该名称是从POM文件生成的,它是以下的串联:
<groupId>com.example</groupId>
<artifactId>myapp</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
到目前为止,我已经离开了使用@EJB注入所有资源,但现在我需要从JSF Converter访问CustomerService EJB,所以我正在做一个像这样的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以便我可以以编程方式在runtile上构建JNDI名称。我已尝试按照该链接的建议在web.xml文件中设置它,但它被忽略了。我认为我宁愿在运行时建立名称,因为这意味着在部署应用程序时,螺丝钉的范围会更小。
非常感谢你的帮助,我一直在整理我的头发。
答案 0 :(得分:3)
如果EJB包含在WAR中,只需使用java:module别名:
java:module/CustomerService
答案 1 :(得分:0)
如何在maven中设置模块名称或如何恢复模块名称,以便我可以在运行时以编程方式构建JNDI名称。
好吧,正如提供的链接中所写,关于EJB 3.1中可移植全局JNDI名称的module-name
:
<module-name>
默认使用包名称(.war或.jar)而不使用包扩展名。
所以我会配置Maven并将finalName
设置为不包含WAR名称中的版本:
<project>
...
<build>
<finalName>${artifactId}</finalName>
...
</build>
</project>
在GlassFish上部署时,不确定为什么NetBeans包含软件包名称和下划线(NetBeans正在这样做,对吧?),如果可以避免NB这样做。