我使用Wildfly 8测试了我的第一个sessoin bean。我使用以下代码获取bean的代理
InitialContext ctx = new InitialContext();
Object obj = ctx.lookup("java:global/EJBDemo/FirstDemoEJB");
当我打印出对象时,我得到以下输出
远程EJB StatelessEJBLocator的代理{appName ='',moduleName ='EJBDemo',distinctName ='',beanName ='FirstDemoEJB',view ='interface com.demo.ejb.FirstDemoEJBRemote'}
我可以使用上面的查找继续使用RMI并获得所需的结果。
但是,我观察到Wildfly在部署时列出了其他查找路径。
java:global/EJBDemo/FirstDemoEJB!com.demo.ejb.FirstDemoEJBRemote
java:app/EJBDemo/FirstDemoEJB!com.demo.ejb.FirstDemoEJBRemote
java:module/FirstDemoEJB!com.demo.ejb.FirstDemoEJBRemote
java:jboss/exported/EJBDemo/FirstDemoEJB!com.demo.ejb.FirstDemoEJBRemote
当我使用其他查找名称名称(在!标记之前的部分)时,我得到以下输出
EJBDemo / FirstDemoEJB - 服务jboss.naming.context.java.app.TestEJB.EJBDemo.FirstDemoEJB
但我不能像在java:global lookup中那样获得所需的结果。
我的问题是Wildfly列出的这些其他查找路径是什么意思?它们也可以用于JNDI查找吗?如果是这样怎么办?
答案 0 :(得分:0)
在Java EE 6之前,每个应用程序服务器(Weblogic,JBoss,Glassfish等)都有自己的JNDI命名约定,那么应用程序并不是跨服务器的便携式设备。
在Java EE 6中,规范标准化了JNDI地址。
来自https://docs.oracle.com/cd/E19798-01/821-1841/girgn/index.html:
三个JNDI名称空间用于可移植JNDI查找:java:global, java:module和java:app。
java:global JNDI命名空间是查找远程的可移植方式 使用JNDI查找的企业bean。 JNDI地址属于 以下表格:
java:global [/ application name] / module name / enterprise bean name [/ interface name]应用程序名称和模块名称默认为 应用程序和模块的名称减去文件扩展名。 只有在打包应用程序时才需要应用程序名称 在EAR内。只有企业才需要接口名称 bean实现了多个业务接口。
java:module命名空间用于查找本地企业bean 在同一个模块中。 JNDI使用java:module命名空间进行寻址 具有以下形式:
java:module / enterprise bean name / [interface name]接口名称 仅当企业bean实现多个时才需要 业务界面。
java:app命名空间用于查找本地企业bean 打包在同一个应用程序中。也就是说,企业bean是 打包在包含多个Java EE模块的EAR文件中。 JNDI 使用java:app命名空间的地址具有以下形式:
java:app [/ module name] /企业bean名称[/ interface name] 模块名称是可选的。只有在需要时才需要接口名称 enterprise bean实现了多个业务接口。
例如,如果企业bean MyBean打包在Web中 应用程序归档myApp.war,模块名称是myApp。便携式 JNDI名称是java:module / MyBean使用的等效JNDI名称 java:global namespace是java:global / myApp / MyBean。