私はJersey-Appを設定するためにJersey-Guiceを使用していますが、これに続いてtemplateです。 GuiceServletContextListener.getInjector()
メソッドによって返されたInjector
がGuice.createInjector()
によって作成された場合、すべて正常に動作します。そのインジェクタが別のインジェクタの子である場合、バインドされたリソース(たとえば、コード内のMyResource
)はジャージーResourceConfig
に追加されず、Jerseyはルートリソースの欠落に関する苦情を受けてクラッシュします。通常の「INFO:ルートリソースクラスとしてのmy.example.MyResourceの登録」がログに表示されないため、バインドされたリソースがスキャンされるとは思われません。インジェクタが子供の場合、Jersey-Guiceはバインドされたリソースを処理しませんか?
これはなぜ起こっているのでしょうか?どちらのバージョンも以下のとおりです。
その他の質問:メイン()クラスでアプリケーションデータサービスオブジェクトを構成したいので、私は子インジェクタを使用しようとしています。ジャージーのリソースだけでは、それにアクセスする必要があります。私はまだジャージーの資源に注入する必要があります。
アプリケーションインジェクタとサーブレットインジェクタの間でアプリケーションシングルトンを共有する方が良い場合は、私の現在のアプローチであるサーブレットインジェクタがアプリケーションインジェクタの子であるよりも優れています。
このバージョンが動作します。
public class MyConfig extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
return Guice.createInjector(new ServletModule() {
@Override
protected void configureServlets() {
bind(MyResource.class);
serve("*").with(GuiceContainer.class);
}
});
}
}
次のコードは機能しません。
public class MyConfig extends GuiceServletContextListener {
final Injector parentInjector;
public MyConfig(Injector injector) {
this.parentInjector = injector;
}
@Override
protected Injector getInjector() {
return parentInjector.getChildInjector(new ServletModule() {
@Override
protected void configureServlets() {
bind(MyResource.class);
serve("*").with(GuiceContainer.class);
}
});
}
}