エンタープライズ アプリケーション A と B を (WLS 10.0 で) デプロイしています。A は「フレームワーク」、B はクライアント アプリです。クライアントは次の呼び出しを発行します。
Object o = ctx.lookup(jndiName); // line 1
cf = (ConnectionFactory) o; // line 2
ConnectionFactory はインターフェースであり、次のように定義されています。
public interface ConnectionFactory
extends java.io.Serializable, javax.resource.Referenceable {
...
}
何が起こるか:
- インターフェイス クラスを含む jar がシステム クラスパスにある場合、2 行目は正常に実行されます。
- インターフェイス クラスがシステム クラスパス上になく、アプリケーションとは別にパッケージ化されている場合、2 行目で ClassCastException がスローされます (これには、o が ConnectionFactoryImpl であるという情報テキストが含まれます)。
なぜこれが可能なのですか?JNDI ルックアップはリモート オブジェクトにスタブのみを返すと仮定します (この点で正しいでしょうか?) では、インターフェイス クラスのクラスローダーが異なる場合、なぜ問題になるのでしょうか?
私が期待する答えの種類:
- はい、それはあなたが経験したように起こるはずです...
- いいえ、それはこのように起こるべきではありません。
- あなたが説明した状況は非常に奇妙です。どこかの点を見逃していませんか?
- ... :)
また、誰かが JNDI とスタブがどのように機能するか、キャストがどこで行われるか (スタブのクライアント側で? またはリモート側の元のオブジェクトで?) などを明確にできるとよいでしょう。
ご協力いただきありがとうございます!