【问题标题】:How can I mix Guice and Jersey injection?如何混合 Guice 和 Jersey 注射?
【发布时间】:2013-08-28 13:37:06
【问题描述】:

我已经看到 the following question 了解如何将 @Context 依赖项注入 Jersey 资源构造函数。但我的问题略有不同——我想注入一个@PathParam 字符串。我有一个类似于以下的类:

@Path("foo/{fooId}/bar")
public class BarResource {
  @Inject
  public BarResource(@PathParam("fooId") String foo, Service service) {
    ...
  }
  ...
}

Service 被 Guice 很好地注入,但路径段始终为空。这实际上让我感到惊讶;如果我认为 Guice 会大声抱怨无法解决的依赖关系的话。

如何以这种方式注入路径参数?为了保持这些资源类可单元测试,我宁愿避免字段注入。

【问题讨论】:

    标签: java jersey guice


    【解决方案1】:

    默认情况下,@PathParam 似乎不能作为Constructor 参数接受。这个new feature document 状态

    资源类构造函数中允许的参数取决于用于创建资源类实例的资源提供者 [...]。对于默认的 per-request 资源类,您可以使用带有 UriParam、UriParam、QueryParam、MatrixParam、HeaderParam 或 HttpContext 注释的参数的任意组合。

    您可以提供自己的资源提供程序来处理@PathParam 注释。

    【讨论】:

    • 我不确定您所说的不在处理请求的上下文中是什么意思。它不是作为单例绑定的;当我在调试器中跟踪它时,构造函数确实是根据 HTTP 请求调用的。来自 Jersey 文档:“默认情况下,JAX-RS 资源在每个请求范围内进行管理,这意味着为每个请求创建新资源。”
    • 另外,我可以注入 UriInfo 并从中访问 fooId 路径段。但它更混乱,我想尽可能让这个构造函数保持 POJO 风格。因此,我想知道是否有任何方法可以按预期使用 @PathParam 注释。
    • @TomG 似乎默认资源提供者不允许@PathParam
    • @TomG 暂时忘记我说的话。尝试使用 @PathParam 注释类的字段,因为 this 表示它应该可以工作。
    • 我明白了——那真是太糟糕了。不过,感谢您至少确认我不应该在上面浪费更多时间。