3

.ear標準libディレクトリのファイルがあります。

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

そのディレクトリに別の.jarファイルがありますlibUserInfoResourceJAX-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

4

1 に答える 1

3

明示的なスコープ/@ManagedBean アノテーションがアタッチされていない限り、Jersey はリソースをマネージド Bean として扱いません。したがって、インジェクションが機能するには、リソースに @ManagedBean または @RequestScoped でアノテーションを付ける必要があります。

問題は、beans.xml がリソース jar ファイルに含まれている場合にのみ発生するようです。それを削除して @ManagedBean アノテーションをリソース クラスにアタッチすると (beans.xml が存在しない場合は @RequestScoped が機能しないため、@RequestScoped の代わりに) 機能します。私は CDI の専門家ではないので、これが設計どおりなのかバグなのかはわかりません。

于 2012-06-10T15:54:58.377 に答える