【发布时间】:2016-11-23 23:33:18
【问题描述】:
我相信这个问题是What is local/remote and no-interface view in EJB?的延伸
我正在尝试将一组 EJB Jars 从 WebLogic 移植到 JBoss。整个系统很旧,EJB 是 2.0。我试图通过将部署描述符更改为 3.2 来更新它。
这部分比较容易。
这是不是的部分。
参与此安排的 EJB 都实现了 SessionBean 接口。它们的本地和远程接口是通用的,它们继承自一个通用的业务接口。这是部署描述符的示例:
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="http://xmlns.jcp.org/xml/ns/javaee"
version="3.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_3_2.xsd">
<module-name>WhizBangSessionEJB</module-name>
<enterprise-beans>
<session>
<ejb-name>WhizBangSessionEJB</ejb-name>
<home>com.whatever.hostinterface.ServiceLogicHome</home>
<remote>com.whatever.hostinterface.ServiceLogic</remote>
<local-home>com.whatever.hostinterface.ServiceLogicLocalHome</local-home>
<local>com.whatever.hostinterface.ServiceLogicLocal</local>
<ejb-class>com.whatever.whizbang.ejbs.WhizBangSessionBean</ejb-class>
<session-type>Stateful</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
我还应该在这里提到这些接口的签名:
public interface ServiceInterface
{
// business interface methods.
}
public interface ServiceLogic extends EJBObject, ServiceInterface
{}
public interface ServiceLogicLocal extends ServiceLogic, EJBLocalObject
{}
所以一个ServiceLogic IS-A ServiceInterface。 ServiceLogicLocal IS-A ServiceLogic,因此 IS-A ServiceInterface
使用远程接口,servlet 能够实例化一个 bean,如下所示:
Object home = ctx.lookup({JNDI of Home Interface});
EJBHome obHome = (EJBHome)PortableRemoteObject.narrow(home, EJBHome.class);
Method m = obHome.getClass().getDeclaredMethod("create", new Class[0]);
sl = (ServiceLogic) m.invoke(obHome, new Object[0]);
我有我的 EJB,可以转换成服务逻辑。
但是这些 EJB 和 Servlet 总是在同一个容器中。因此指示了本地接口。这是我遇到麻烦的地方。 并且本地 EJB 在 3.x 中不需要 Home 接口。
所以我认为这样的事情应该可行。
sl = (ServiceLogicLocal)ctx.lookup({JNDI of Local Interface to Bean});
这会失败并出现以下错误。
java.lang.ClassCastException: com.whatever.hostinterface.ServiceLogicLocal$$$view60 cannot be cast to com.whatever.hostinterface.ServiceLogicLocal
而且我知道本地主页界面不是必需的,但我已经创建了它。尝试使用它并调用它的 create() 方法会产生与我失败的相同类型的 ClassCastException,因为尝试将对象的视图(代理)转换为该类型的对象。
本地 EJB 接口和本地 EJB 接口的 ClientView 有什么区别,如何通过其本地接口实例化此 EJB?
谢谢。
【问题讨论】:
-
ServiceLogicLocal.class 的副本如何在您的 EAR 文件中四处浮动,它们在哪里?
-
没有 Ear 文件。在同一应用程序服务器上的 ejb jar 中部署了一个带有 Servlet 和 EJB 的 war 文件。这样做是为了允许单独部署 EJB。
-
如果没有 EAR 文件,那么你的 web 模块就看不到 ejb 模块中的类,这让我想知道它在哪里得到
ServiceLogicLocal.class
标签: jakarta-ee ejb