2016-04-11 15 views
1

私の質問は、JavaSEアプリケーションとServletModuleを実行するときに、jettyやtomcatのようなサーブレットコンテナにデプロイされているアプリケーションを作成するときにAbstractModuleを作成する必要があるのはなぜですか?彼らの違いは何ですか?JerseyとGoogle Guiceの統合

私はジャージーとGuiceを統合する必要があります。何とかそれを使用するジャージーのためのGuiceの存在を登録する必要がありますか?私は注射を可能にし、私が望むあらゆる場所(通常のクラス、フィルター、ハンドラー、サービス、DAOなど)で行うことはできませんか?なぜ、JavaSEアプリケーションのようにguiceを設定するだけではなく、ServletModuleを使用する必要があるのでしょうか?

私はウェブ上で見る限り、GuiceのHK2サービスの使用例が多く、その逆もありますので、重要と考えることができますか? (必要?)

おかげ

答えて

4

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を初期化するときにインジェクタを作成するだけで、設定やアプリケーションによって異なります。

+0

ここで、はるかに明確に思われます。たとえば、jax-rsリソース(エンドポイント)はHK2によって内部的に作成され、jax-rsにguiceを使用してリソースを作成するよう指示します。 btw統合の実例がありますか?昨日私はウェブ上で見つけたすべてのものを試してみましたが、誰も助けてくれませんでした..まだヌルポインタ – azalut

+0

例で更新しました。いいえ、HK2はまだオブジェクトを作成していますが、レジストリだけでなくGuiceのリソースも検索します。今はっきりしたいと思っています。 – sargue

関連する問題