在.ear文件中使用的java:app JNDI名称是否需要moduleName组件?

时间:2014-01-31 18:43:10

标签: java-ee jndi

我将一个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命名空间有什么用处?

2 个答案:

答案 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”