混合Guice构造函数注入和Jersey @Context

时间:2012-06-13 23:09:57

标签: jersey guice

我正在尝试使用Jersey注入的@Context参数和注入Guice的参数来使用构造注入。

这适用(纯泽西注射):

@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

1 个答案:

答案 0 :(得分:0)

您应该能够使用@Context将其注入实例字段。如果这不能解决您的问题(即您确实需要在构造函数中访问它),您可以在http://java.net/jira/browse/JERSEY处提交增强请求,我们会将其添加到JerseyServletModule。这种变化很小。