この問題はやや複雑で、私は少し頭がいっぱいです。できるだけ簡単に説明しようと思います。
Glassfish v2 で実行され、EMF ( MDHT ) の実装を使用して CCD メッセージを消費する J2EE アプリケーションがあります。これが EJB を呼び出す Web サービスから呼び出されると、完全に機能し、1 年以上機能しています。最近、WAR からこれを呼び出す理由がありました。テスト ケースは、通常 Web サービス経由で送信される同じファイルをユーザーがアップロードすることです。WAR からこれを呼び出すと、動作しません。EMFEPackage.Registry
は空です!
これを WAR から呼び出すと、WAR は EJB セッション Bean のインスタンスを取得し、単に EJB を呼び出します。コードが重複しないように、可能な限り多くのロジックを EJB に保持したいと考えています。
MDHT User リストに関する議論に基づいて、これは MDHT の問題というよりも EMF の問題であり、どのクラスローダが使用されているかに関連していると私は信じています。
MDHT および EMF ライブラリは EJB JAR にパッケージ化され、EJB クラスローダに表示されます。
この問題を絞り込むために、いくつかの回避策とポイントを試しました。
- JARを移動して、MDHTライブラリを表示できないクラスローダーの問題かどうかを確認しました
- デバッガーをチェックインして、レジストリーが作成されたときにどのクラスローダーが動作しているかを確認しました
- EMFを深く掘り下げ、監視しました
ClassNotFoundExceptions
- ロギング ブレークポイントを設定して、レジストリにデータを入力するときにどのクラスローダーが使用されているかを確認します。予想通り、EJB クラスローダを使用しているようです。
EJB ではなく WAR から呼び出された場合に EMF 実装が異なる動作をする、既知または一般的な使用例はありますか?
これは本当に EMF の問題ですか、それとも WAR で EJB を呼び出す場合のより一般的な問題ですか?
この問題の根本原因を切り分けて特定するには、他にどのようなデバッグ手順を試す必要がありますか?