代码之家  ›  专栏  ›  技术社区  ›  aaronvargas

远程调用同一服务器上存在的EJB时发生ClassCastException

  •  1
  • aaronvargas  · 技术社区  · 16 年前

    我有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:嵌套异常为:java.lang.ClassCastException:$proxy126 java.lang.ClassCastException:$proxy126

    我使用WebLogic 10,Java 5,EJB3

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

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

    我做错什么了??

    另外,在本地复制时,EJB-A会倾向于在同一服务器上使用EJB-B,因此很难进行复制。但其他机器却不是这样。

    注意:这对于EJB2都是正确的。

    1 回复  |  直到 16 年前
        1
  •  1
  •   aaronvargas    16 年前

    所以我可以通过添加 @远程主页(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;
    }
    

    然后我的豆子

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

    以前,只有bean和远程接口存在。(没有本地用法)

    总的来说,这个修复使我的EJB3更像EJB2-ISH,而不是那么干净(涉及更多的代码和类)。我也不清楚为什么我可以从本地对远程主页接口(和调用创建)进行JNDI查找 和远程服务器 不会得到ClassCastException,但是当我为远程接口执行此操作时,我 获取ClassCastException。这是WebLogic中的错误吗?(我也看到过一些类似的帖子使用jboss)

    推荐文章