我正在测试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
产生了类强制转换异常。
然后我在两个场景中测试上面的代码:
我将EJB和Web模块打包成一个EAR module
。然后,在EAR
中部署了此JBoss 4.2.3
模块,上面的查找代码就像魅力一样。
我尝试使用JBoss 5
,甚至分别部署了EJB模块和Web模块,上面的查找代码运行良好。
那么,为什么当我在JBoss 4中单独部署2个模块时,事情没有成功呢?我只使用本地JNDI查找,因为2个模块部署在同一个容器中。 我是否遗漏了某些内容,或者这是JBoss 4中的一个缺陷?
答案 0 :(得分:1)
尝试使用以下代码代替您的演员:
HelloLocalHome rv = (HelloLocalHome)javax.rmi.PortableRemoteObject.narrow(o, HelloLocalHome.class);
如果现在有效,那么你就有了臭名昭着的类加载问题。 (JBoss 5的默认服务器使用不同的类加载机制的原因之一)。最简单的方法是将它们放在一个EAR中(因此Home和远程类只加载一次)。 Web应用程序中的Home接口类由与JNDI返回的类接口不同的类加载器加载。
您也可以从WAR文件的类或lib dirrectory
中删除接口