.ear
標準lib
ディレクトリのファイルがあります。
.jar
そのディレクトリにファイルがありますlib
。インターフェイスである が含まれてUserInfoManager
います。(これらの目的のために)他のクラスは含まれていません。ファイルも含まれていMETA-INF/beans.xml
ます。
そのディレクトリに別の.jar
ファイルがありますlib
。UserInfoResource
JAX-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