远程调用同一服务器上存在的 EJB 时出现 ClassCastException
我有2个ejb。调用 Ejb-B 的 Ejb-A。他们不在同一个耳朵里。
为了可移植性,Ejb-B 可能存在于同一服务器上,也可能不存在。 (有一个外部属性文件,其中包含 Ejb-B 的提供程序 URL。我对此无法控制。)
示例代码:在 Ejb-A
EjbBDelegate delegateB = EjbBDelegateHelper.getRemoteDelegate(); // lookup from list of URLs from props...
BookOfMagic bom = delegateB.getSomethingInteresting();
用例/结果中:
- 当 Ejb-B 不存在与 Ejb-A 位于同一服务器上,一切正常。 (它通过 URL 进行循环)
- 当 Ejb-B 确实存在 在同一服务器上,并且 Ejb-A 碰巧在同一服务器上调用 Ejb-B 时,一切正常。
- 当 Ejb-B 确实存在 在同一台服务器上,并且 Ejb-A 在不同的服务器上调用 Ejb-B 时,我得到:
javax.ejb.EJBException:嵌套异常为:java.lang.ClassCastException:$Proxy126 java.lang.ClassCastException:$Proxy126
我正在使用 Weblogic 10.0、Java 5、EJB3
基本上,如果 Ejb-B 存在于服务器上,则必须仅在该服务器上调用它。
这让我相信该类是由本地类加载器加载的(在部署时?),然后当远程调用时,另一个类加载器正在加载它。 (导致异常)但它应该可以工作,因为它应该被序列化到目标类加载器中......
我做错了什么?
此外,在本地复制时,Ejb-A 会优先选择同一服务器上的 Ejb-B,因此很难复制。但在其他机器上却并非如此。
注意:这对于 EJB2 来说一切正常
I have 2 ejbs. Ejb-A that calls Ejb-B. They are not in the same Ear.
For portability Ejb-B may or may not exist on the same server. (There is an external property file that has the provider URLs of Ejb-B. I have no control over this.)
Example Code: in Ejb-A
EjbBDelegate delegateB = EjbBDelegateHelper.getRemoteDelegate(); // lookup from list of URLs from props...
BookOfMagic bom = delegateB.getSomethingInteresting();
Use Cases/Outcomes:
- When Ejb-B DOES NOT EXIST on the same server as Ejb-A, everything works correctly. (it round-robbins through the URLs)
- When Ejb-B DOES EXIST on the same server, and Ejb-A happens to call Ejb-B on the same server, everything works correctly.
- When Ejb-B DOES EXIST on the same server, and Ejb-A calls Ejb-B on a different server, I get:
javax.ejb.EJBException: nested exception is: java.lang.ClassCastException: $Proxy126
java.lang.ClassCastException: $Proxy126
I'm using Weblogic 10.0, Java 5, EJB3
Basically, if Ejb-B Exists on the server, it must be called ONLY on that server.
Which leads me to believe that the class is getting loaded by a local classloader (on deployment?), then when called remotely, a different classloader is loading it. (causing the Exception) But it should work, as it should be Serialized into the destination classloader...
What am I doing wrong??
Also, when reproducing this locally, Ejb-A would favor the Ejb-B on the same server, so it was difficult to reproduce. But this wasn't the case on other machines.
NOTE: This all worked correctly for EJB2
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
因此,我能够通过向 bean 添加一个 @RemoteHome(MyRemoteHome.class) 来“修复”这个问题,
然后再向我的 bean
添加。 以前,只有 bean 和 Remote 接口存在。 (没有本地使用)
总体而言,此修复使我的 EJB 3 更像 EJB 2,并且不那么干净(涉及更多代码和类)。我也不清楚为什么我可以从本地和远程服务器对RemoteHome接口进行jndi查找(并调用创建)并且不会得到ClassCastException,但是当我对远程接口执行此操作时,我确实得到一个ClassCastException。这是 Weblogic 中的错误吗? (我也看到过一些类似使用JBoss的帖子)
So I was able to 'fix' this issue by adding a @RemoteHome(MyRemoteHome.class) to the bean
then my bean
Previously, only the bean and the Remote interface existed. (there is no local usage)
Overall, this fix makes my EJB 3 a bit more EJB 2-ish and not as clean (more code and classes involved). I am also unclear why I can do a jndi lookup for the RemoteHome interface (and call create) from my local and remote servers and not get a ClassCastException, but when I do this for the Remote interface, I do get a ClassCastException. Is this a bug in Weblogic? (I've also seen some posts similar using JBoss)