2012-03-04 11 views
2

私はJerseyを使用してGrizzlyを使用してREST APIを構築しています。私はGoogle Guiceのような依存性注入フレームワークを使用していません。Jerseyリソースに依存関係を挿入するにはどうすればよいですか?

GET要求に応答して、1つのリソースでマップからデータを取得する必要があります。

Jerseyではリソースの初期化方法を制御しないため、このマップをリソースに注入する方法がわかりません。

私はちょうど静的なマップを宣言できたが、それは非常に醜い解決策のように思える。

+0

多分Springを使うのでしょうか? –

+4

確かに、ジャージーでこの非常に基本的なことを達成する方法は、春のような大規模な依存関係を引き出すことなくです! – sanity

+0

あなたのマップは通常どこから開始されますか?あなたのリソースにpublicコンストラクタを作成してそこで初期化することはできますが、(@ Singletonでアノテーションを付けない限り)リクエストごとに呼び出されるわけではありません。 –

答えて

3

私は最終的に解決策を見つけ、私は次のように、「プロバイダ」を作成する必要があります。この場合には、私が実際にデータベース接続プールへのアクセスを取得するために必要な、あなたが見ることができるように

@Provider 
public class DBPoolInjectableProvider extends SingletonTypeInjectableProvider<Context, BoneCPDataSource> { 

    public DBPoolInjectableProvider() throws SQLException { 
     super(BoneCPDataSource.class, APIMain.getDBPool()); 
    } 
} 

が、他のタイプのオブジェクトに対しても同じ考え方が有効です。個人的に私はこのことを考える

public TestResponse testGet(@Context final BoneCPDataSource ds) throws SQLException { 
    ... 
} 

(:

私はちょうどジャージーによってスキャンされたパッケージ内にこのプロバイダを入れて、それを拾って、それはジャージーリソースに、このような方法を見ている時はいつでも、それを使用しています一種の「遠隔での行動」は反パターンですが、私はそれを今働いているので黙っています)

+1

Jersey 2の 'SingletonTypeInjectableProvider'はもう使用できません。 HK2は今や好ましい方法です:https://github.com/jersey/jersey/blob/master/tests/e2e/src/test/java/org/glassfish/jersey/tests/e2e/server/CustomInjectablesResourceConfigTest.java – Michiel

0

は、次の操作を行うことができます。

  • はあなたが必要とマップへのアクセス権を持つフィルタを作成します。
  • 処理した後のアクセスのローカル変数
  • つまり、あなたがマップにアクセスする必要があるとき、あなたのリソースには、変数
  • にマップを入れて、要求を処理する前にフィルター
  • 内のスレッドローカル変数を宣言しますリクエスト、このマップをクリーンアップします。

実際は、Hibernate/JPAで要求ごとにセッションを宣言するのとほぼ同じです。

関連する問題