JNDI Lookup on JBoss AS 6.0



我在 JBoss 6.0 AS 上的 localhost 上部署了一个应用程序。此应用程序有一个名为 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"分别。我无法按预期执行查找。

有人有线索吗?

如果您使用的是 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.ear包含myEjb.jar,其中包含一个名称为 ExampleEJB 的 EJB,那么试试这个 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/env vs. global:java:comp/env 和 java:global 之间的关系是什么

好的,我已经解决了我的问题。我发现可以通过访问 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");

一切都很顺利。

最新更新