2

Jersey で注入された @Context パラメーターと Guice で注入されたパラメーターの両方を使用して、コンストラクション インジェクションを使用しようとしています。

これは機能します(純粋なJerseyインジェクション):

@Path("top")
public class TopLevel
{
  public TopLevel(@Context ResourceContext context)
  {
    ..
  }
}

これは機能します(純粋なGuiceインジェクション):

@Path("top")
public class TopLevel
{
  @Inject
  public TopLevel(MyService service)
  {
    ..
  }
}

しかし、これは機能しませ:

@Path("top")
public class TopLevel
{
  @Inject
  public TopLevel(MyService service, @Context ResourceContext context)
  {
    ..
  }
}

Guice は ResourceContext を注入する方法を知らないためです。JerseyServletModuleを見ると、次のクラスが挿入されていることがわかります。

WebApplication, Providers, FeaturesAndProperties, MessageBodyWorkers, ExceptionMapperContext, HttpContext, UriInfo, ExtendedUriInfo, HttpRequestContext, HttpHeaders, Request, SecurityContext and HttpResponseContext

ResourceContext ではありません。何か案は?

UPDATE : ResourceContext を使用して別のインスタンス フィールドをインスタンス化する必要があるため、フィールド インジェクションを使用できないと思います。例えば:

public class Foo
{
  public Foo(ResourceContext context) {}
}

public class Bar
{
  private final MyService service;
  private final ResourceContext context;
  private final Foo foo;

  @Inject
  public Bar(MyService service, @Context ResourceContext context)
  {
    this.foo = new Foo(context);
  }
}

コンストラクターの後に ResourceContext をインスタンス化しようとすると、インスタンス化できませんでしFooた。

4

1 に答える 1

0

@Context を使用してインスタンス フィールドに挿入できるはずです。それでも問題が解決しない場合 (つまり、コンストラクターで実際にアクセスする必要がある場合)、http://java.net/jira/browse/JERSEY で拡張要求を提出できます。JerseyServletModuleに追加します。変更はごくわずかです。

于 2012-06-13T23:46:44.033 に答える