分别部署ejb模块和Web模块时无法访问bean?

时间:2012-05-19 10:43:50

标签: jboss ejb-2.x

我正在测试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产生了类强制转换异常。

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

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

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

  3. 那么,为什么当我在JBoss 4中单独部署2个模块时,事情没有成功呢?我只使用本地JNDI查找,因为2个模块部署在同一个容器中。 我是否遗漏了某些内容,或者这是JBoss 4中的一个缺陷?

1 个答案:

答案 0 :(得分:1)

尝试使用以下代码代替您的演员:

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

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

您也可以从WAR文件的类或lib dirrectory

中删除接口