2

私は現在、Jersey と Guice を DI コンテナーとして使用して REST Web サービスを開発しています。

GuiceServletContextListenerリクエストを処理するために、次のように構成された に依存しています。

bind(UserResource.class);
//Some other root-level resources for REST

serve("/rest/*").with(GuiceContainer.class);

階層データを処理する必要があるため (1 人のユーザーが独自のアイテムを持つ必要があり、他のユーザーのアイテムに の形式でアクセスできる必要があります/rest/user/[Username]/item)。このために、Jersey のサブリソースのサポートを使用しています。

たとえば、 myUserResourceには次のメソッドが含まれています (ItemResource.Factoryは、実装が Guice によって自動的に提供されるファクトリ インターフェイスですFactoryModuleBuilder)。

@Inject
private ItemResource.Factory _itemResourceFactory;

@Path("/{username}/item")
public ItemResource getItems(@PathParam("username") String username) {
   User user = //...
   return this._itemResourceFactory.create(user);
}

ItemResource(サブリソース) は、コンストラクターで渡された User に基づいて、通常の Jersey クラスとして実装されます。

@Contextただし、サブリソースもフィールド (UriInfoまたは など) にアクセスする必要がありますHttpServletRequest。Jersey のドキュメントによると、@Contextサブリソースのライフサイクルが不明であるため、フィールドはサブリソースに挿入されません (ドキュメントは正しいようです)。

これは私にとって非常に残念なことです。これらの値にアクセスする必要があるのです。
回避策として、私は現在、これらの値を追加のコンストラクターパラメーターとしてサブリソースに渡していますが、これは快適ではないと認識しています。

とにかくJerseyにそれらを注入するように指示する可能性はありますか?

@Contextそれにもかかわらず、Guice 自体がフィールドを注入できればさらに良いでしょう。ただし、 Guice にはor などの型の登録がないため、for を
単純に交換しても機能しません。@Context@InjectUriInfoHttpServletRequest

どうにかしてこれらのマッピングを作成できますか? 問題は、Guice実装
内の要求固有の値にアクセスする方法がわからないことです。 必要なプロバイダーを記述できるように、これらの Jersey オブジェクトの現在のインスタンスにアクセスするためのヘルパー メソッドはありますか?Provider

それとも、それらの実装はすでにどこかで利用可能になっているのでしょうか?

4

2 に答える 2

0

あなたの問題を理解できたかどうかわかりません。「これらの値を追加のコンストラクターパラメーターとして渡す」ことに関連するコードを投稿できますか?

次のように Context を注入できます。

@Path("/{username}/item") public ItemResource getItems(@Context HttpServletRequest request, @PathParam("username") String username) {

于 2013-01-30T18:56:34.627 に答える
-1

プログラムでフィールドを挿入できるかもしれませんか?Guiceは、Injectorクラスを通じてこれを提供します。

Injector injector = Guice.createInjector(...);
injector.injectMembers(someObjectToInject);

このトピックの詳細については、 http://code.google.com/p/google-guice/wiki/Injectionsを参照してください。

于 2012-10-18T19:06:45.870 に答える