当前位置: 首页 > 知识库问答 >
问题:

JBoss AS 6.0上的JNDI查找

邹正阳
2023-03-14

我在JBoss 6.0上的localhost上部署了一个应用程序。此应用程序有一个名为Examplejb的远程EJB bean。现在,我尝试编写一个使用Examplejb的简单客户端应用程序。此客户端应用程序将不会部署在任何应用程序服务器上。其思想是编写一个简单的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”。我无法按要求执行查找。

有人有线索吗?

共有2个答案

池砚文
2023-03-14

好了,我的问题解决了。我发现,通过访问JBoss JMX管理控制台(本地主机的默认位置:8080/JMX控制台/),可以可视化JBoss上的JNDI树。找到JNDIView服务并调用list方法。通过可视化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");

一切都很顺利。

楚知
2023-03-14

如果您使用的是java: global/,那么JNDI名称应如下所示:

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

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

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

如果既有本地接口又有远程接口,则可以使用此方案进行区分:

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

其中接口包含包和接口名称(例如:a. b. c.审阅EJBRemoteIfc)。

因此,在您的设置中:如果myApp.ear包含myEjb.jar,其中包含一个EJB,其名称是审阅EJB,然后尝试这个JNDI名称:

java:global/myApp/myEjb/ExampleEJB

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

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

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

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

 类似资料:
  • 以前的尝试是让Netbean将EJB模块部署到Netbean可以访问的Glassfish服务器上,该模块以JAR而不是EAR的形式构建。但是,通过CLI使用将该JAR部署到Glassfish可能会遇到错误。 EAR通过CLI部署时没有问题--但是,EJB的JNDI名称似乎不起作用。差异是什么? 32.4.1.1可移植JNDI语法 三个JNDI名称空间用于可移植JNDI查找:java:global、

  • 我使用Liberty Profile v8.5.5.5(WebSphere Application Server8.5.5.5/wlp-1.0.8.cl50520150221-0034)IBMJ9 VM,版本pxa6470sr1-20120330_01(SR1)(en_US) 我已经安装了jndi功能。。。但无论我做什么,我都无法进行简单的JNDI查找。 在我server.xml 我的代码...(

  • 我的应用程序有一些OSGI模块和一个非OSGI部分。我尝试通过ApacheAries的JNDI在非osgi子系统中查找osgi服务。我用玻璃鱼。 我的蓝图xml如下所示: 我尝试了以下查找: 我部署了4个捆绑包: Apache Aries Util 但我得到一个例外: 我忘带包裹了吗?有人能帮我吗?

  • 如果有人能帮助我纠正代码中的问题,我将不胜感激。不知道我哪里错了。 当前我的persistence.xml包含

  • 我得到一个javax。命名。NameNotFoundException:在尝试查找EJB3无状态会话bean时。 我有一个weblogic域,它包括两个服务器Server_1和server_2。我已经将一个EAR文件部署到server_2其中包含一个EJB3部署。它里面有以下内容 EJB3模块jar文件包括以下内容 在服务器1上,我部署了EJB3客户机Jar,其中包含我的远程接口。在这个服务器上,

  • 在查找jdbc数据源的JNDI连接时,我遇到以下错误: javax。命名。ConfigurationException:无法完成“java:”名称上的JNDI操作,因为服务器运行时无法将该操作的线程与任何J2EE应用程序组件关联。当使用“java:”名称的JNDI客户端未在服务器应用程序请求的线程上执行时,可能会出现这种情况。确保J2EE应用程序不会在静态代码块或该J2EE应用程序创建的线程中对“