线程"P=69052:O=0:CT" java.lang.ClassCastException中的异常: org.omg.stub.java.rmi._Remote_Stub



我使用的是EJB 9.0,我编写了一个RMI类来调用远程的EJB。当我运行时,控制台显示以下错误:

线程异常p =69052: 0 =0:CT"java.lang.ClassCastException:org.omg.stub.java.rmi._Remote_Stub

RMI调用:

MyEjbRemote ejb = (MyEjbRemote) ctx.lookup(JNDI_NAME_EJB);

远程类有@Statless和@Remote标签。有人能帮我吗?

WebSphere使用RMI/IIOP提供对EJB远程接口的支持,这需要实现EJB远程接口的客户端_Stub类。当ctx.lookup()出现在托管线程中时,容器通常会自动为您生成_Stub类,并从查找中返回,然后可以将其强制转换为远程接口。

不幸的是,由于各种原因,这可能不会发生。例如,查找是从瘦客户机执行的。对于这些场景,您将需要执行以下一项或两项操作:

1—执行PortableRemoteObject.narrow():

MyEjbRemote ejb = (MyEjbRemote) PortableRemoteObject.narrow(ctx.lookup(JNDI_NAME_EJB), MyEjbRemote.class);

这通常解决命名服务可能缓存了一个没有缩小的值,或者可能使用不同的类加载器缩小了的值的问题。

2 -为远程接口生成_Stub类,并将其打包为执行查找的应用程序代码。WebSphere提供的createEJBStubs.sh/.bat命令可用于生成_Stub类。另外,如果远程接口扩展了java.rmi.Remote,那么您可以使用带有-iiop选项的JDK中的RMIC命令。关于createEJBStubs的信息可以在这里找到:

https://www.ibm.com/docs/en/was/9.0.5?topic=beans-create-stubs-command

这解决了执行查找的线程不是托管线程的问题。托管线程是容器专门为运行应用程序而创建的线程。托管线程包含应用程序上下文信息,并且能够根据需要动态生成EJB构件,例如_Stub类。

最新更新