.ear標準libディレクトリのファイルがあります。
.jarそのディレクトリにファイルがありますlib。インターフェイスである が含まれてUserInfoManagerいます。(これらの目的のために)他のクラスは含まれていません。ファイルも含まれていMETA-INF/beans.xmlます。
そのディレクトリに別の.jarファイルがありますlib。UserInfoResourceJAX-RS リソース クラスであるという名前のクラスが含まれています。そのクラスには次のものが含まれています。
@Inject
private UserInfoManager userManager;
.jar次に、ファイルのルートにEJBファイルがあり.earます。UserManagerBeanインターフェイスを実装するという名前のクラスが含まれていUserInfoManagerます。このクラスにはアノテーションが付けられて@Statelessおり、基本的にそれ以外のものはありません (したがって、ローカル ビジネス インターフェース ( ) を介して公開されるローカル ステートレス セッション Bean になりますUserInfoManager)。この.jarファイルにはファイルもありMETA-INF/beans.xmlます。
次に、クラスのみを含む.warファイルがあります。これは、ディレクトリApplication内に存在するデプロイメント時に検出されたすべての JAX-RS リソースの「マウント ポイント」として機能します。libこの Java EE 6 モジュールには Bean が含まれていないため、CDI Bean アーカイブとして宣言しません。
この仕様に準拠した配置は、展開時に失敗します。Weld (GlassFish 3.1.2 の CDI 実装) は、利用可能な既知の実装がないため、上記の注入ポイントを満たすことができないと主張してUserInfoManagerいます。
その注入ポイントに@EJB代わりに注釈が付けられている場合、すべてが正常に機能します。
クラスパスに存在する JAX-RS リソースにローカルのステートレス セッション Bean 参照を挿入するように CDI を取得するにはどうすればよいですか?
更新:どう見ても仕様違反のように思えるので、テストケースを添付してバグを報告しました。読者の皆様には、実際に機能するかどうかを確認することをお勧めします。
更新:回避策は、JAX-RS クラスがBeanアーカイブではなく、. さらに、マウント ポイントとして機能する {{.war}} ファイルは、Bean アーカイブである必要があります ({{WEB-INF/beans.xml}} ファイルが必要です)。これらの要件の一部の組み合わせは、CDI 仕様違反です。次のバグは、これらの問題を追跡しています: http://java.net/jira/browse/GLASSFISH-18793@ManagedBean