我有2个ejb。 Ejb-A称为Ejb-B。他们不在同一个耳朵。

为了可移植性,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都正常工作

最佳答案

因此,我可以通过在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;
}


然后我的豆

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


以前,仅存在bean和Remote接口。 (没有本地用法)

总体而言,此修补程序使我的EJB 3变得有点像EJB 2,而不是干净的(涉及更多的代码和类)。我也不清楚为什么我可以在本地和远程服务器上为RemoteHome接口执行jndi查找(并调用create),而没有得到ClassCastException,但是当我为Remote接口这样做时,却得到了ClassCastException。这是Weblogic中的错误吗? (我也看到过一些使用JBoss的帖子)

09-30 14:56
查看更多