AbstractModule
はGuiceののブートストラップ(コンフィギュレーション)相の基本的なビルディング・ブロックです。あなたは常にそのうちの1つ以上が必要です。一方、ServletModule
は、サーブレットコンテナで実行されているという事実を考慮して、いくつかの設定を行う特殊化です。 Guice documentationから
:
このモジュールは、要求とセッションスコープを設定し、あなたからのフィルタやサーブレットを設定するには 場所を提供します。
Guice-Jerseyの統合については、確かに設定する必要があります。それは青からうまくいかないでしょう。 Guiceは他の依存性注入フレームワークと同様ににオブジェクトをビルドする際に動作します。疑わしいときは、誰がオブジェクトを作成するのかを尋ねてください。
ジャージーとJAX-RSでは、一般に誰がオブジェクトを作成しますか?あなたはあなただけではありません。コンテナによって作成されます。 JAX-RSランタイムあなたのケースでは、Jerseyのランタイムです。 Jerseyは内部的にHK2依存性注入フレームワークを使用しています。したがって、Guiceのリソースで定義したJAX-RSクラスを注入するには、ブリッジの両方のフレームワークが必要です。または、他の方法で周り!それがHK2-guice bridgeがある理由です。そこでジャージーはHK2を使ってオブジェクトを構築し、HK2はブリッジのおかげでGuiceにもリソースを探します。
単純な例です。 I use this code私はGuiceリソースを注入したいREST APIを初期化します。
@ApplicationPath("api")
public class ApiRest extends ResourceConfig {
private static final Logger log = LoggerFactory.getLogger(ApiRest.class);
@Inject
public ApiRest(ServiceLocator serviceLocator, ServletContext servletContext) {
log.debug("Inicialitzant Jersey.");
packages("net.sargue.app.api");
GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
Injector injector = (Injector) servletContext.getAttribute(Injector.class.getName());
if (injector == null)
throw new RuntimeException("Guice Injector not found");
guiceBridge.bridgeGuiceInjector(injector);
}
}
上記の例では、それがServletContext
からのGuiceインジェクタを引っ張るとして登録ServletModule
を必要としていることに注意してください。または、インジェクタをServletContext
に追加するだけでもかまいません。また、REST APIを初期化するときにインジェクタを作成するだけで、設定やアプリケーションによって異なります。
ここで、はるかに明確に思われます。たとえば、jax-rsリソース(エンドポイント)はHK2によって内部的に作成され、jax-rsにguiceを使用してリソースを作成するよう指示します。 btw統合の実例がありますか?昨日私はウェブ上で見つけたすべてのものを試してみましたが、誰も助けてくれませんでした..まだヌルポインタ – azalut
例で更新しました。いいえ、HK2はまだオブジェクトを作成していますが、レジストリだけでなくGuiceのリソースも検索します。今はっきりしたいと思っています。 – sargue