1

我在 JBoss 6.0 AS 的本地主机上部署了一个应用程序。此应用程序有一个名为 ExampleEJB 的远程 EJB bean。现在我正在尝试编写一个使用 ExampleEJB 的简单客户端应用程序。此客户端应用程序不会部署在任何应用程序服务器上。这个想法是编写一个简单的 Java SE 客户端程序。我写了以下试图执行查找:

Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL,"localhost:1099");
env.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");

InitialContext ic = new InitialContext(env);

在这一点上,我尝试了两种方法第一种是执行直接查找,如 Java EE 6 教程 ( http://docs.oracle.com/javaee/6/tutorial/doc/gipjf.html ) 中的示例:

ExampleEJB exampleEJB = (ExampleEJB) ic.lookup("java:global/myApp/ExampleEJB");

第二次尝试是尝试获取 JNDI 上下文环境,然后从该环境中获取所需的 bean:

Context envContext  = (Context)ic.lookup("java:/comp/env");
envContext.lookup(...)

问题是我收到以下异常:“javax.naming.NameNotFoundException: global not bound”和“javax.naming.NameNotFoundException: comp not bound”。我无法根据需要执行查找。

有人有线索吗?

4

2 回答 2

5

如果您使用java:global/,则 JNDI 名称应如下所示:

java:global/<application>/<module>/<component>

或者

java:global/<ear>/<ejb-jar>/<ejb-name>

其中ear是.ear 文件的名称,ejb-jar是EJB .jar 文件的名称。


如果您同时具有本地和远程接口,则可以使用此方案进行不同的操作:

java:global/<ear>/<ejb-jar>/<ejb-name>!<interface>

其中接口包含包和接口名称(例如:)a.b.c.ExampleEJBRemoteIfc


因此,在您的设置中:如果myApp.earcontainsmyEjb.jar包含名称为 的 EJB ExampleEJB,请尝试使用此 JNDI 名称:

java:global/myApp/myEjb/ExampleEJB

或者

java:global/myApp/myEjb/ExampleEJB!a.b.c.ExampleEJBRemoteIfc

无论如何,在 JMX 控制台中仔细检查 JNDI 名称:

http://localhost:8080/jmx-console/
  1. 点击服务=JNDIView
  2. 操作列表:点击调用按钮
  3. 按 EJB 名称在该页面中搜索

至于comp/envglobaljava:comp/env 和 java:global 之间的关系是什么

于 2013-08-24T21:16:47.080 回答
1

好的,我已经解决了我的问题。我发现可以通过访问 JBoss JMX 管理控制台(默认位置在 localhost:8080/jmx-console/)来可视化 JBoss 上的 JNDI 树。找到 JNDIView 服务并调用列表方法。通过可视化 JNDI 树,我发现我在寻找错误的位置。JBoss 在以下位置注册了我的 EJB:

+- ExampleEar (class: org.jnp.interfaces.NamingContext)
  |   +- ExampleEJBImpl (class: org.jnp.interfaces.NamingContext)
  |   |   +- remote-br.exemplo.ejb.ExampleEJB (class: Proxy for: br.example.ejb.ExampleEJB)
  |   |   +- remote (class: Proxy for: br.example.ejb.ExampleEJB)

我刚刚修改了我的代码以在以下位置执行查找:

ExampleEJB exampleEJB = (ExampleEJB) ic.lookup("ExampleEar/ExampleEJBImpl/remote");

一切顺利。

于 2013-08-24T21:01:44.880 回答