私は現在、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
@Inject
UriInfo
HttpServletRequest
どうにかしてこれらのマッピングを作成できますか? 問題は、Guice実装
内の要求固有の値にアクセスする方法がわからないことです。
必要なプロバイダーを記述できるように、これらの Jersey オブジェクトの現在のインスタンスにアクセスするためのヘルパー メソッドはありますか?Provider
それとも、それらの実装はすでにどこかで利用可能になっているのでしょうか?