我将一个EJB打包在.ear
文件中。
此EJB需要查找对同一.jar
文件中不同.ear
文件中打包的另一个EJB的引用。
调用EJB不知道目标EJB所在的模块。
从阅读Java EE规范来看,这似乎正是java:app
命名空间的用途。我认为我可以这样做:
final Frobnicator f = (Frobnicator)context.lookup("java:app/FrobnicatorBean");
...但是在GlassFish 3.1.2.2中找不到bean名称。
我可以看到bean已成功部署并获得分配给它的全局 JNDI名称,因此它存在,并且上面的bean名称(FrobnicatorBean
)是正确的。< / p>
我误读了规范吗?我是否必须实际指定模块名称?如果是这样,java:app
命名空间有什么用处?
答案 0 :(得分:1)
我是否必须实际指定模块名称? 如果是这样,java:app命名空间有什么用处?
根据ejb 3.1规范:
4.4全局JNDI访问 - &gt; 4.4.1.1 java:app
java:app前缀允许在Java EE应用程序中执行的组件访问特定于应用程序的命名空间。
结果语法为:
java:app/<module-name>/<bean-name>[!<fully-qualified-interface-name>]</html>
Note that <module-name> is a required part of the syntax...
答案 1 :(得分:0)
1)您可以获取jndi资源树的句柄并打印所有ejb资源名称。我通过添加以下代码在嵌入式glassfish中完成了这个:
String command = "list-jdbc-resources";
CommandRunner commandRunner = glassfish.getCommandRunner();
CommandResult commandResult = commandRunner.run(command);
System.out.println("jdbc resources=" + commandResult.getOutput());
Logger.getLogger(this.getClass().getName()).log(Level.INFO,"jdbc resources=" +commandResult.getOutput());
打印树列表后,您可以在查找操作期间使用相同的名称。 2)如果无法完成上述解决方案,那么您可以在“app”的位置尝试使用您的耳朵应用程序的自定义名称。比如,如果部署的app-name为'ln',则查找字符串将变为“java:ln / FrobnicatorBean”