2

Web プロジェクト、ejb3 プロジェクト、および ejb クライアントを使用して EAR を作成しました。サーブレットでインジェクションを介して Bean メソッドを呼び出すことができます。Bean 呼び出しを処理するために pojo である ServiceDelegate を使用する予定です。したがって、サーブレットからデリゲートを呼び出すと、デリゲートは適切な Bean とそのメソッドを呼び出します。

しかし、Web プロジェクトにあるデリゲート クラスで Bean 参照を取得できません。@EJB アノテーションが null 参照を返しました。そこで、java:comp/env/EARname/BeanNameで JNDI ルックアップを試みました。しかし、私はいつも命名の例外に行き着きます。

名前 comp/env/EARname がコンテキスト "java:" に見つかりません。

Websphere 7 サーバーで JNDI 経由で ejb3 Bean を呼び出す正しい方法を教えてください。

4

1 に答える 1

2

Java EE 5 および 6 の依存性注入は、マネージド クラスに対してのみ機能します。サーブレット コンテナでは、これはいくつかのタイプのクラスでサポートされており、すべての POJO でサポートされているわけではありません (残念ながら)。

Servlet Spec 2.5 は、コンテナーが存在する場合に依存関係を注入する必要があるクラスに光を当てます。


コンポーネント タイプ: サーブレット

以下のインターフェースを実装するクラス

  • javax.servlet.サーブレット

コンポーネント タイプ: フィルター

次のインターフェースを実装するクラス:

  • javax.servlet.Filter

コンポーネント タイプ: リスナー

次のインターフェースを実装するクラス:

  • javax.servlet.ServletContextListener
  • javax.servlet.ServletContextAttributeListener
  • javax.servlet.ServletRequestListener
  • javax.servlet.ServletRequestAttributeListener
  • javax.servlet.http.HttpSessionListener
  • javax.servlet.http.HttpSessionAttributeListener

したがって、依存関係の検索で問題を解決する必要がある場合は、次のいずれかの戦略を採用できます。

  • 依存関係をマネージド クラスに挿入し、それを ServiceDelegate に伝達します。これは私見のデザイン臭です。
  • InitialContext を使用して JNDI ルックアップを実行しますが、デプロイした EJB に対して生成された JNDI バインディングに注意する必要があります。JNDI 名が正しくない可能性があるため、これは失敗しているようです。Java EE 仕様では、デプロイされた EJB に割り当てられる JNDI 名が標準化されていません。つまり、移植可能な JNDI 名がないため、EJB を既知の名前にバインドして、同じ名前のルックアップを実行する必要があります。
  • EJB セッション オブジェクトが実際に java:comp/env 名前空間にバインドされていることを確認する必要があります。そうではないかもしれません。依存関係がコンテナによって注入されない場合は、明確にするために、web.xml でローカル EJB 参照エントリを宣言する必要があります。コンテナは、セッション EJB オブジェクトをサーブレットの名前空間に自動的に挿入しません。EJB をマネージド クラスのリソースとして宣言する必要があります。最後にリストされていますが、これが失敗の主なケースのようです。
于 2010-08-20T21:33:30.013 に答える