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で正しく機能しました