2

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

这有效(纯泽西注射):

@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 来实例化另一个实例字段。例如:

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 回答