コンテキストと依存関係注入のトラブルシューティング
Java™ Platform, Enterprise Edition (Java EE) アプリケーションの Contexts and Dependency Injection (CDI) に関連したエラーをトラブルシューティングします。
始める前に
このタスクについて
CDI 実装の使用時、アプリケーションのデプロイメント中、または CDI が他の Java EE コンポーネントと対話するときに、エラーが発生することがあります。また、プロデューサー、インターセプターと装飾機能、または診断トレースに関する問題が発生する可能性もあります。このタスクでは、発生する可能性のあるこれらのエラーを修正します。
手順
- アプリケーション・デプロイメントの問題をトラブルシューティングします。 アプリケーションのデプロイメント時に、コンテナーではアプリケーション内の各注入ポイントを検証する必要があり、コンテナーはその依存関係の 1 つのソースのみで満たされます。
トラブルの回避 (Avoid trouble): ホット・デプロイメントは、CDI アプリケーションではサポートされていません。更新を使用可能にするには、アプリケーションを再始動する必要があります。gotcha
- 不明確な依存関係を解決します。
不明確な依存関係、つまり javax.enterprise.inject.AmbiguousResolutionException 例外は、コンテナーが注入ポイントのタイプと修飾子を複数の Managed Bean、プロデューサー・メソッド、またはプロデューサー・フィールドに解決するときに発生します。
この例外により、処理されていた注入ポイント、およびタイプ・セーフな解決プロセスの終わりに保持されていた候補 Bean が示されます。単一の Bean 以外の場合は、次のアプリケーション・エラーが発生します。
エラーを解決するには、以下のいずれかのアクションを実行します。org.jboss.weld.exceptions.DeploymentException: WELD-001409: Ambiguous dependencies for type OtherBean with qualifiers @Default at injection point [BackedAnnotatedField] @Inject private basic.injection.SimpleBean.bean at basic.injection.SimpleBean.bean(SimpleBean.java:0) Possible dependencies: - Managed Bean [class basic.injection.OtherBean] with qualifiers [@Any @Default], - Producer Method [OtherBean] with qualifiers [@Any @Default] declared as [[BackedAnnotatedMethod] @Produces basic.injection.OtherBeanProducer.produceOtherBean()]
- 注入ポイントを明確にするため、注入ポイントに修飾子を追加し、必要に応じて依存関係の 1 つのソースを追加します。
- 必要に応じて、依存関係の一部が注入に適していない場合は、コンテキスト・インスタンスのソースの 1 つに @Alternative または @Specializes のアノテーションを付けます。
- 満たされない依存関係を解決します。 満たされない依存関係、つまり javax.enterprise.inject.UnsatisfiedResolutionException は、アプリケーション内の注入ポイントと一致するオブジェクトに対応するソースが存在しないときに発生します。フィールドの API タイプは、修飾子アノテーションのオプション・セットとともに、依存関係を満たすことができる Bean のセットを示します。依存関係が満たされない原因は次のとおりです。
- 注入ポイントのタイプに割り当て可能な Managed Bean がない。
- 注入ポイントに戻りタイプを割り当てることができる Managed Bean のプロデューサー・メソッドがない。
- 注入ポイントにタイプを割り当てることができる Managed Bean のプロデューサー・フィールドがない。
- 前述のシナリオの 1 つが有効だが、注入ポイントの修飾子アノテーションが Bean またはプロデューサーに存在しない。
注: 新規 Bean の導入、修飾子の削除、またはプロデューサー・フィールドまたはプロデューサー・メソッドの追加を行い、API タイプおよび修飾子を使用した依存関係を使用可能にすることにより、エラーを解決します。Java 仕様の Contexts and Dependency Injection のセクション 5.2 で、タイプ・セーフな解決について詳しく説明しています。org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type OtherBean with qualifiers @British at injection point [BackedAnnotatedField] @Inject @British private basic.injection.SimpleBean.bean at basic.injection.SimpleBean.bean(SimpleBean.java:0) WELD-001475: The following beans match by type, but none have matching qualifiers: - Managed Bean [class basic.injection.OtherBean] with qualifiers [@Any @Default], - Producer Method [OtherBean] with qualifiers [@Any @Default] declared as [[BackedAnnotatedMethod] @Produces basic.injection.OtherBeanProducer.produceOtherBean()]
- 非活性化有効範囲の依存関係を解決します。 非活性化は、メモリー補助ストレージに保持されているアイドル・オブジェクトを移動する動作です。非活性化有効範囲 (例えば、組み込み有効範囲など) の @SessionScoped と @ConversationScoped は、有効範囲を使用する Bean が非活性化対応であることを必要とします。Bean は、ステートフル・セッション Bean である場合、またはその他の Managed Bean である場合 (シリアライズ可能であり、シリアライズ不可能なインターセプターおよび装飾機能を備えている場合)、非活性化対応です。非活性化有効範囲の依存関係の原因には、以下のものがあります。
- 既存の Bean の有効範囲が非活性化有効範囲 (例えば、@SessionScoped、@ConversationScoped など) に変更される。
- シリアライズ不可能な装飾機能またはインターセプターが既存の非活性化対応 Bean に追加される。
- 問題となっている Bean がシリアライズ可能であることを確認します。
- Bean のすべてのインターセプターと装飾機能がシリアライズ可能で実装されていることを確認します。
- Managed Bean の有効範囲を活性化有効範囲に変更します。
- 不明確な依存関係を解決します。
- 他の Java EE コンポーネントと対話する CDI が原因のエラーをトラブルシューティングします。
@Inject アノテーションの追加タイプは Java EE 依存関係注入です。Java EE 5 に定義されている注入への関係は次のとおりです。
- @Inject アノテーション以外のアノテーションを使用する注入は、従来のリリースのように動作し、@Inject アノテーションを使用して注入された依存関係のみが、Contexts and Dependency Injection for Java (JSR299) によって定義されたコンテキスト・インスタンスになります。
- プロデューサー・フィールドとプロデューサー・メソッドを使用して、@Resource、@PersistenceContext、@PersistenceUnit、および @WebServiceRef アノテーションによって取得された Java EE 依存関係の制限付き CDI フィーチャー (例えば、タイプ・セーフな注入など) を提供します。
JavaServer Pages (JSP) および JavaServer Faces (JSF) コンポーネントを参照する Managed Bean への式言語 (EL) 参照の値を取得できない場合は、次のアプローチを考慮してください。- Bean クラスに、@Named アノテーションを使用してアノテーションが付けられていること、または @Named アノテーションを定義するステレオタイプによってアノテーションが付けられていることを確認します。
- EL 式の先頭文字を小文字に変換した後、EL 式が Bean クラスのクラス名と一致していることを確認します。@Named アノテーション修飾子を値メンバーとともに使用すると (例えば、@Named("myName") など)、Bean 名 (特殊なケース修飾子) が指定されますが、その Bean の EL 名は変更されません。
EJB コンポーネントの場合:- @Inject および @EJB アノテーションを使用してセッション Bean を注入できます。@Inject アノテーションを使用してステートフル・セッション Bean を注入すると、セッション Bean では、修飾子を使用するタイプ・セーフな注入を利用でき、ライフサイクルをそれらの CDI 有効範囲で管理できます。
- セッション Bean は、他の Managed Bean とは異なり、@Inject アノテーションを使用して取得されなかった場合でも、インターセプトと装飾に適しています。
Web サービス・コンポーネントの場合:- Web サービス記述言語 (WSDL) ファイルから JAX-WS クライアントを開発するには、トピック『WSDL ファイルからの JAX-WS クライアントの開発』で説明しているステップを実行します。ヒント: 移植可能な Java 成果物 (サービス・クラスを含む) を生成するには、wsimport ツールを使用します。
- @WebServiceRef アノテーションを使用して、生成されたサービス・クラスを CDI Managed Bean に注入するには、-wsdllocation 引数を使用して wsimport ツールを呼び出す必要があります。その結果、生成されたサービス・クラスは、絶対パスではなく相対 URI を使用して WSDL ファイルを参照するため、他のシステムへ移植可能になります。
- プロデューサーのエラーをトラブルシューティングします。
- プロデューサー・メソッドでループが発生しています。 プロデューサー・メソッドを使用すると、各パラメーターが、コンテナーから依存関係が提供される注入ポイントとして扱われます。そのため、それらのパラメーター注入ポイントを満たすコンテキスト・オブジェクトのソースは、プロデューサー・メソッドが含まれているクラスと同じクラスであってはなりません。
- プロデューサー・メソッド (同じクラス内で同じ修飾子を持つ 2 つの @Produces アノテーション) が重複しています。 クラスに複数のプロデューサー・フィールドがある場合は、これらのフィールドの API タイプおよび修飾子のセットを同じにすることができません。これらを同じにすると、生成される不明確な依存関係を注入できなくなります。
- インターセプターと装飾機能のエラーをトラブルシューティングします。
トラブルの回避 (Avoid trouble): フェイルオーバー・シナリオでは、@Inject Validator および @Inject ValidatorFactory はサポートされていません。gotcha
- beans.xml ファイルで、または @Priority を使用してインターセプター、装飾機能使用可能化インターセプター、および装飾機能を使用可能にします。EJB セッション Bean 以外はすべて、Bean のコンテキスト・インスタンスにのみ適用されます。コンテキスト・インスタンスとは、@Inject アノテーションを使用するか、BeanManager インターフェースでメソッドを呼び出すことによって取得されるインスタンスです。
- インターセプターと装飾機能が複数の Bean デプロイメント・アーカイブ (BDA) にあります。インターセプターまたは装飾機能が beans.xml ファイルによって使用可能にされた場合、これらのインターセプターまたは装飾機能はそのアーカイブでのみ使用可能になります。インターセプターまたは装飾機能が @Priority によって使用可能にされた場合、インターセプターまたは装飾機能はアプリケーション全体で使用可能になります。
- 診断トレースを使用して、エラーの発生原因を特定します。
- CDI のトレースを取得するため、JCDI=all:com.ibm.ws.cdi*=all:org.jboss.weld*=all を指定します。
- Java EE 注入および EJB コンテナーと対話できるように追加トレースを取得するため、EJBContainer=all:MetaData=all:Injection=all を指定します。
- Web 関連有効範囲およびライフサイクルと対話できるように追加トレースを取得するため、all:com.ibm.ws.wswebcontainer*=all を指定します。
- Managed Bean のデフォルトのコンストラクターで負荷の大きい操作を回避します。
指定された Managed Bean の各注入ポイントでは、プロキシーの使用時に作成された可能性のある実際の Bean インスタンスに加えて、基となる Bean クラスのデフォルト・コンストラクターを呼び出す新規クライアント・プロキシーを受け取ります。さらに、コンストラクターの完了後に依存関係の注入が行われるため、コンストラクターは注入された依存関係を使用できません。基となるインスタンスのみで実行される注入後論理を配置する場所については、@PostConstruct アノテーションのライフサイクル・コールバックを参照してください。


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tweb_troubleshoot_cdi
ファイル名:tweb_troubleshoot_cdi.html