Jersey2でリソースクラスへのDIをGuice3で行うには

268 views
Skip to first unread message

yamamoto

unread,
Feb 4, 2014, 1:44:03 AM2/4/14
to glas...@googlegroups.com
山本といいます。
 
現在NetBeans7.4で作成したGlassFish ServerベースのWebプロジェクトで、
リソースクラス(クラス宣言に@Pathをつけたクラス)に宣言したインスタンス変数に対して、
Guice3によるDIでインスタンスを注入したいと考えております。
 
Jerseyのマニュアルも参考にしておりますが、
具体的な実装方法が分からない状態です。
 
GuiceによるDIが必須要件の為、
まずJersey2でリソースクラスへのDIが、
Guiceを用い可能なのかが分かると助かります。
 
よろしくお願いいたします。
 

Kenji HASUNUMA

unread,
Feb 11, 2014, 12:36:47 PM2/11/14
to glas...@googlegroups.com
蓮沼です。

最初に回答を申し上げると、現状では不可能と思って良いです。ただし、多くの方々が必要性を感じているようで、今後のアップデートで実現できるようになる可能性は十分にあります。

現状、Jersey 2.x の DI は CDI (GlassFish 4 の場合は Weld) に依存しています。Weld も Guice も JSR 330 に基づく DI を実装しているため、何も考えずに Weld と Guice を共存させるようなことをすると、良くて Guice が無視され、最悪の場合は Weld と Guice がコンフリクトして地獄のようなデバッグ作業が待ち受けています。

もっとも、Jersey プロジェクトでは Guice への対応も進めているようで、例えば以下のようなチケットが起票されていたりします(まだ解決していませんが)。

https://java.net/jira/browse/JERSEY-1950

GlassFish 4 の CDI については、HK2/OSGi といった GlassFish の基盤が密接に関連しており (GlassFish 3 との最大の相違点)、一筋縄ではいかないようです。

また、「具体的な実装方法が分からない」とのことですが、Java SE 環境では手動で DI コンテナを設定して最初の Bean をロードする必要がありますが、Java EE 7 環境ではデフォルトで CDI が DI コンテナとして設定されており、勝手に Bean を探し出して DI をやってしまう仕様が、今回のケースでは裏目に出ていると思われます。Java EE 7 の場合、標準では Guice の初期化を行う便利な API が存在しない、というのが今回の話をややこしくしているところでしょう。

Jersey 2 の Guice 3 対応については、Jersey の基盤である Servlet 3.x のリスナーを活用して Guice のコンテナを起動し、リソースクラスを Guice の管轄下に置こうという方針で進めているようです。CDI も beans.xml で DI のスキャンを無効化するオプションも用意されているため、将来的には連携できるようになる可能性があります。

まとめると、
  • 現状、コンテナ上で Jersey 2 の DI を Guice 3 で実現するのは極めて困難。
  • もし Guice 3 にこだわるのなら、Jersey 2 だけでなくその基盤である Servlet 3.1 を活用する必要がある。
と言ったところでしょうか。

私も最近、DI コンテナ関連の情報を集めています(Weld/Weld SE、Guice、Spring に限られますが)。途中経過をお知らせ頂けると、当方でも検証することができるかもしれません。今後も途中経過をご報告頂けると何かしらお力添えができるのではないかと思っています。

どうぞよろしくお願いします。
Reply all
Reply to author
Forward
0 new messages