JNDI と J2EE の特定の ClassCastException を理解するのに助けが必要です
-
23-09-2019 - |
質問
エンタープライズ アプリケーション 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 とスタブがどのように機能するのか、キャストがどこで行われるのか (スタブのクライアント側でしょうか?) を明確にできれば素晴らしいと思います。それともリモート側の元のオブジェクト上でしょうか?)など。
ご協力いただきありがとうございます!
解決
答えは、残念ながら、(1)である。
JNDIは、オブジェクトがツリーに保存されている、またはそれがクライアントに配信される方法をどのようにするためのメカニズムを規定していません。これは、操作を実行するために使用するだけのAPIです。
彼らはここにあるとして両方のアプリケーションが、同じJVMにある場合は、、そしてWeblogicの可能性が非常に高いだけのクライアントアプリケーションにオブジェクトを直接手渡しています。何のスタブ、および「リモート側」はありません。そのオブジェクトによって実装型(タイプIDが、クラス名によって定義され、また、それはからロードされたクラスローダされ、覚えて)クライアント・アプリケーションには見えないからである。
あなたはこの現象が発生する奇妙なことだと思うかもしれないが、アプリケーションは次のように自分自身の中で話していることを念頭に置いてクマは、JavaEEの開発では当たり前ではありません - アプリが唯一のシステムレベルのリソースを共有し、互いに分離されることになっていますます。