0

我正在测试一个 EJB 2.x 应用程序。我分别创建了 2 个模块:

EJB 模块:包含一个简单的无状态会话 bean

Web 模块:包含用于查找 EJB 模块的单个 servlet 页面。我正在使用Jboss 4.2.3.

首先,我部署了 EJB 模块,部署顺利。 其次,我部署了web模块,部署很顺利。

然后我使用以下代码查找 EJB 模块:

Context c = new InitialContext();
Object o = c.lookup("HelloJNDI"); // Line 1
HelloLocalHome rv = (HelloLocalHome) o; // Line 2
HelloLocal local =  rv.create(); 

查找进行得很顺利 ( Line 1),但Line 2产生了一个类转换异常。

然后我在2个场景中测试上面的代码:

  1. 我将 EJB 和 Web 模块打包成一个EAR module. 然后,在 中部署这个EAR模块JBoss 4.2.3,上面的查找代码就像一个魅力。

  2. 我尝试使用JBoss 5,甚至分别部署了 EJB 模块和 Web 模块,上面的查找代码效果很好。

那么,为什么当我在 JBoss 4 中分别部署这 2 个模块时,事情没有成功呢?我只使用本地 JNDI 查找,因为这 2 个模块部​​署在同一个容器中。是我遗漏了什么还是这是 JBoss 4 中的一个缺陷?

4

1 回答 1

1

尝试使用以下代码而不是您的演员表:

HelloLocalHome rv = (HelloLocalHome)javax.rmi.PortableRemoteObject.narrow(o, HelloLocalHome.class);

如果这确实有效,那么您就有臭名昭著的类加载问题。(JBoss 5 的默认服务器使用不同的类加载机制的原因之一)。最简单的方法是将它们放在一个 EAR 中(因此 Home 和远程类只加载一次)。Web 应用程序中的 Home 接口类由与 JNDI 返回的类加载器不同的类加载器加载。

您还可以从 WAR 文件的类或 lib 目录中删除接口

于 2012-05-20T06:53:28.483 回答