java - 远程调用同一服务器上存在的 EJB 时出现 ClassCastException

标签 java ejb-3.0 weblogic weblogic-10.x java-ee-5

我有 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();
<小时/>

用例/结果:

  1. 当 Ejb-B 不存在与 Ejb-A 位于同一服务器上时,一切正常。 (它通过 URL 进行循环)
  2. 当 Ejb-B 确实存在在同一服务器上,并且 Ejb-A 碰巧在同一服务器上调用 Ejb-B 时,一切正常。
  3. 当 Ejb-B 确实存在 在同一台服务器上,并且 Ejb-A 在不同的服务器上调用 Ejb-B 时,我得到:

javax.ejb.EJBException: nested exception is: java.lang.ClassCastException: $Proxy126 java.lang.ClassCastException: $Proxy126

我正在使用 Weblogic 10.0、Java 5、EJB3

基本上,如果服务器上存在 Ejb-B,则必须仅在该服务器上调用它。

这让我相信该类是由本地类加载器加载的(在部署时?),然后当远程调用时,另一个类加载器正在加载它。 (导致异常)但它应该可以工作,因为它应该被序列化到目标类加载器中......

我做错了什么?

此外,在本地复制时,Ejb-A 会优先选择同一服务器上的 Ejb-B,因此很难复制。但在其他机器上并非如此。

注意:这对于 EJB2 来说一切正常

最佳答案

因此,我能够通过向 bean 添加 @RemoteHome(MyRemoteHome.class) 来“修复”此问题

public interface MyRemoteMethods {
    String myMethod() throws RemoteException; // this Ex is required
}

public interface MyRemote extends EJBObject, MyRemoteMethods { 
}

public interface MyRemoteHome extends EJBHome {
    public MyRemote create() throws CreateException, RemoteException;
}

然后是我的 bean

...
@RemoteHome(MyRemoteHome.class)
public class MyBean implements MyRemoteMethods {
...

以前,仅存在 bean 和远程接口(interface)。 (本地没有使用)

总体而言,此修复使我的 EJB 3 更像 EJB 2,但不那么干净(涉及更多代码和类)。我也不清楚为什么我可以从本地和远程服务器对 RemoteHome 接口(interface)进行 jndi 查找(并调用 create)而不会得到 ClassCastException,但是当我对 Remote 接口(interface)执行此操作时,我确实得到 ClassCastException。这是 Weblogic 中的错误吗? (我也看到过一些类似使用JBoss的帖子)

关于java - 远程调用同一服务器上存在的 EJB 时出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3058770/

相关文章:

java - 在同一类中实现 2 个不同的监听器并添加到 swing 组件中

java - Spring Security 的 AJAX 请求给出 403 Forbidden

java - 使用 servlet 的正确方法是什么?

java - Spring MVC weblogic ClassNotFoundException

java - weblogic.application.ModuleException : Context path '' is already in use by the module:/application:

java - 什么是NullPointerException,我该如何解决?

java - 异常后丢失EntityManager

java - EJB 计时器是否应该持久/可靠?

jakarta-ee - EJB 中的异步调用方法

java - 为 maven 指定类路径