web-dev-qa-db-ja.com

RESTfulサービスにJerseyとGuiceを使用する際の実用的なアドバイス

私がオンラインで見つけることができるものから、Guice + Jersey統合の最先端は、両チームが行き詰まったように見える2008年以来停滞しています。問題の核心は、JAX-RSアノテーションがフィールドとメソッドのインジェクションを実行することであり、これはGuice自身の依存性インジェクションとうまく機能しません。

私が見つけたいくつかの例は、解明するのに十分ではありません:

  • Jersey + Google App Engine JavaのGuice に関するIqbalyusufの投稿は、多くの定型文(インジェクターを手動で取得して呼び出す)に苦しんでいます。バインディングとインジェクションは、Guiceアノテーションを介してバックグラウンドで実行する必要があります。

  • Jonathan Curranの記事 Creating a RESTful service with Jersey、Guice、and JSR-25 それははるかに新しい(2010年)ので希望を与えましたが、内部でJerseyサービスを開始する方法を示す以上のことはありませんでしたGuice ServletModule。ただし、実際の依存性注入を行う例はありません。読者の練習問題として残されたと思います。実際、Curranの投稿は、GuiceとJerseyをつなぐための正しい最初のステップかもしれないので、それから始めるつもりです。

  • 食欲をそそる James Strachanが書いています

    JAX-RSは、Spring、Guice、GuiceyFruit、JBossMCなどの依存性注入フレームワークで適切に動作します。基本的にはどちらを選択してもかまいません。

    しかし、開業医の観点からは真実であるという証拠は見当たりません。

私が欠けているのは、JAX-RSとGuiceアノテーションを組み合わせる方法に関する実用的な例と説明です。例えば:

  • Jerseyはこれを制御したいので、リソースでコンストラクター注入を使用できないと思います
  • @Injectと@ PathParam、@ QueryParamなどを組み合わせることができるかどうかはわかりません。
  • MessageBodyWriter実装でインジェクションを使用する方法

プロセスのいずれかを犠牲にすることなく、ジャージーとギスを組み合わせた非自明なアプリケーションの例を、できればソース付きで持っていますか?私は関係なくこの道を続けていますが、ジャージーとギスのリストの断片は、私が前に来た他の人の仕事を繰り返していると思います。

65
toolbear

JerseyとのGuiceの統合は停滞していません。反対は真実です。 PaulとJerseyの背後にいる彼のコホートのおかげで、最新の1.7リリースには、Guiceベースのサーブレットで動作する特別なJerseyServletModuleクラスが含まれています。 JAX-RSリソースへのガイドベースのコンストラクター注入が機能します!問題は、JAX-RSのコンストラクターで@QueryParamなどのJAX-RSアノテーションを使用している資源。必要ありません!シングルトンを含むすべての方法で、POJOインジェクションにGuiceを使用します。 JAX-RSは、URLパス、クエリパラメーター、コンテンツタイプなどのHTTPベースのRESTful APIを解析するためのケーキにアイシングしているだけです。「産業強度」の例も必要ありません。 GuiceとJerseyの両方はすでに戦闘テスト済みです。それがどのように機能するかを確認するには、完全な実例が必要です。その後、独自の高度な機能を試すことができます。すべての最新リリースであるGuice 3.0およびJersey 1.7を使用した完全な例については、次のリンクを参照してください。
http://randomizedsort.blogspot.com/2011/05/using-guice-ified-jersey-in-embedded.html

53
Nehc

ここで、Guice/Jersey/Jetty/Jacksonサンプルアプリケーションを作成しました。

http://github.com/sunnygleason/j4-minimal

サンプルを改善する方法について質問や提案がある場合は、github経由で私にメッセージを送ってください。目標は、これをREST on the Java stack。

これがお役に立てば幸いです-素晴らしい一日を!

-晴れ

21
Sunny Gleason

Sunnysサンプルアプリケーションに触発され、標準のWARファイルを使用して展開する同様のサンプルプロジェクトを作成しました。 Apache Tomcatで。プロジェクトは次の場所にあります。

https://github.com/danbim/template-guice-jersey-Tomcat

楽しんで!ダニエル

9
Daniel Bimschas

最初にGuiceを使用してJersey注釈付きクラスでコンストラクター挿入を行おうとしても、同様の問題が発生していましたが、かなり簡単なアプリケーションではありますが、最終的には動作しました。

ここでの指示に従いました: jersey-guice javadoc

私の場合のトリックは、web.xmlから標準のJersey構成(Jersey ServletContainerなど)を削除し、GuiceリスナーとGuiceフィルターのみを保持する必要があることでした。一度、GuiceがJAX-RS注釈付きオブジェクトを作成するために呼び出され、ジャージーはJAX-RS注釈付きメソッド(@GETなど)を予想どおりに注入しました。

3
Scott

Jerseyはこれを制御したいので、リソースでコンストラクター注入を使用できないと思います

リソースの作成はジャージによって管理されるため、guiceのコンストラクターインジェクションは使用できません。この場合、ジャージの@Inject注入するコンストラクターパラメーターの前の注釈:

public NewsResource(@Inject NewsService service)
3
Jonas

Sunny Gleasonの例は素晴らしいですが、今では少し時代遅れです。

ですから、今日、GuiceとJerseyがお互いにナイスを演じようと苦労した後、次のサンプルプロジェクトを作成して開始しました。

https://github.com/MaliciousMustard/gradle-guice-jersey-jetty

このプロジェクトは次のテクノロジーを使用しています。

  1. DIのガイド
  2. RESTful APIのジャージー
  3. Jackson for POJOからJSONへのマッピング
  4. Webサーバー用のJetty
  5. グラドル

最も重要なことは、追加するすべての新しいリソースクラスを明示的に指定する必要がないことです。スキャンされているパッケージにそれらを追加している限り(malicious.mustard.modules.JerseyModule)、それらは自動的に検出されます!

3
Alex

GWizard には、Jersey2とGuiceのすぐに使用可能な統合を提供するモジュールが含まれています。完全なJAX-RSサービスの例を次に示します。

public class Main {
    @Path("/hello")
    public static class HelloResource {
        @GET
        public String hello() {
            return "hello, world";
        }
    }

    public static class MyModule extends AbstractModule {
        @Override
        protected void configure() {
            bind(HelloResource.class);
        }
    }

    public static void main(String[] args) throws Exception {
        Guice.createInjector(new MyModule(), new JerseyModule()).getInstance(Run.class).start();
    }
}

これは Squarespace jersey2-guice adapter に基づいていることに注意してください。これは、Jerseyの将来のポイントリリースでは正しく機能しない可能性があります。 GWizardは、RESTEasy JAX-RSモジュールも提供していますが、これは推奨されています。

これについて役立つブログエントリを次に示します。 http://blorn.com/post/107397841765/guice-and-jersey-2-the-easy-way

2
stickfigure
1
Gili

これらの例はすべて私にとって素晴らしい出発点でしたが、私はその中心にJersey-Guiceを使用した完全なMVCスタックが必要でした。私はしばらくの間それを改良することに取り組んできました。今週現在、このMVCスタックはアーキタイプとしてMaven Centralリポジトリに完全にデプロイされています。これは、1つのMavenコマンドで新しいJersey-Guiceスタックを作成できることを意味します。

mvn archetype:generate \
    -DarchetypeGroupId=org.duelengine \
    -DarchetypeArtifactId=duel-mvc-archetype \
    -DarchetypeVersion=0.2.1

これにより、パッケージの名前を指定した独自のプロジェクトが自動的に生成されるため、テンプレートプロジェクトを手動で編集する必要はありません。

詳細については、プロジェクトのReadme.mdを参照してください。 https://bitbucket.org/mckamey/duel-mvc

私が使用する両面ビュー(クライアント側テンプレートとサーバー側ビュー)の詳細は次のとおりです。 https://bitbucket.org/mckamey/duel .

1
mckamey

軽量のJetty + Guice + Jackson Webサービスの興味深いプロジェクトを見つけました。 https://github.com/talis/jersey-common/

0
Le Hibou

Guice 4.2、Jetty 9.4、およびJersey 2.7サンプルアプリケーションを作成しました。

https://github.com/bnsd55/jetty-jersey-guice-starter-kit

サニーが言ったように:

サンプルを改善する方法について質問や提案がある場合は、github経由で私にメッセージを送ってください。目標は、これをREST on the Java stack。

0
bnsd55