15

XPages アプリケーションで時折例外が発生していました。

java.lang.ClassCastException: someClass incompatible with someClass.

上記のクラスはどちらも同じで、セッション Bean として使用されるクラスです。私の問題をカバーするものは何もグーグルできませんでした。これについての通常の説明は、私の場合ではなく、デザイン要素の変更でした。

XPage アプリケーションは、その時点以降、http タスクを再起動するか、faces-config.xml を再保存するまで使用できなくなります (セッション Bean someClass を使用するページ)。

場合によっては、これは他の例外に関連しています。

com.ibm.jscript.InterpretException: Script interpreter error, line=x, col=y: 
Java method 'method(signature containg someClass)'
on java class 'someOtherClass' not found

この動作の背後にあるものは何ですか?

4

4 に答える 4

16

Philippe Riand は、電子メールでこれを説明しました。

このクラス キャストは、同じクラスが 2 つの異なるクラス ローダーによって 2 回読み込まれたために発生します。したがって、Java の観点からは、それらは異なり、キャストは失敗します。

現在、各 XPages アプリケーションには独自のクラスローダーがあります。しかし、このクラス・ローダーは、Domino Designer などを介してアプリケーションに設計変更が発生するたびに破棄されます。これは、XPages を変更すると新しい Java クラスが生成されるため、以前のクラスの代わりにロードする必要があるため必要です。これが発生すると、クラスローダーは破棄され、新しいクラスローダーが作成されます。次に、アプリケーション関連のすべてのクラスが、変更されていなくても、必要に応じて再ロードされます。これは、J2EE サーバーによって実装される一般的な動作です。そうは言っても、コードがそうでないスコープでオブジェクトをキャッシュしている場合設計変更が発生したときに破棄された場合、これが発生する可能性があります。たとえば、applicationScope と sessionScope は現在、設計変更が発生しても破棄されないため、この問題が発生する可能性があります。スコープを破棄すると開発者のエクスペリエンスが低下することがあるため、これは設計上の選択でしたが、この欠点があります。

最後に、faces-config.xml を保存すると回避策として機能します。このファイルが保存されると、スコープを含むモジュール全体がメモリから破棄されます。これが機能する理由を説明しています。カスタム Java クラスを変更すると、モジュールがリロードされ、問題が解決されます。

そのため、Bean を (間接的にでも) sessionScope または applicationScope に配置することが原因のようです。

于 2011-03-18T13:30:46.963 に答える
5

同じクラス ファイルが異なるクラス ローダーにロードされた場合、生成される 2 つの Java クラスは同じクラスではありません。一方のインスタンスを他方を期待する関数に渡すことはできません。通常、この種の問題が発生する場合は、共通の親クラスローダーからは見えない jar ファイルにアクセスできる子クラスローダーが複数あることが原因です。「someclass」を含む jar を、(たとえば) 特定の webapp ディレクトリではなく、共通のライブラリ ディレクトリに移動する必要がある場合があります。

于 2011-03-18T13:28:37.333 に答える