【问题标题】:JAX-RS (Apache CXF) Context injection via setterJAX-RS (Apache CXF) 通过 setter 进行上下文注入
【发布时间】:2015-01-09 07:43:28
【问题描述】:

我正在尝试通过 Kotlin 中的 @Context 注释将 HttpServletRequest 注入我的 JAX-RS 资源(Apache CXF 实现)。如果我通过方法参数注入它,它工作正常。但我不想用它“弄乱”我的接口,所以我想通过字段/设置器注入它。

普通字段注入的问题是代理的名称中有 $,这对于 kotlin 来说是一个问题,因为它无法使用名称中带有美元的类名。

所以我正在尝试使用这个简单的方法通过 setter 来做到这一点:

var req : HttpServletRequest? = null

Context
fun setRequest(req : HttpServletRequest) {
    this.req = req
}

问题是(我相信这在 Java 中也应该是一个问题),setter 是通过 org.apache.cxf.jaxrs.utils.InjectionUtils 方法中的反射调用的,该方法在引发 java.lang.IllegalArgumentException 的方法 injectThroughMethod 中:对象不是声明类的实例

我试图用谷歌搜索这个问题,但没有成功。有没有人遇到过类似的问题或者我做错了什么?

顺便说一句,我还在 CXF 的 JIRA 中创建了一个 issue

【问题讨论】:

  • Kotlin 可以使用名称中带有“$”的类,使用反引号进行转义:Foo$Proxy
  • 我建议您在 Java 中重现相同的行为。这个问题很可能与 Kotlin 完全无关。
  • 我同意这可能不是 Kotlin 的问题。这就是为什么我没有以问题的名义提出它。我已经在 J​​IRA 中讨论过它。我将尝试他们的建议并回顾性地更新此线程

标签: jakarta-ee jax-rs kotlin


【解决方案1】:

感谢评论 CXF Jira 问题的人,我设法解决了这个问题。 要使 setter 注入与 CXF 一起使用,您还必须在接口中定义 setter(不仅在实现类上)并在那里用 @Context 注释它(在接口上)。我不确定这是否真的符合规范,但似乎 CXF 需要这样。

像这样:

public MyInterface {
   @Context
   public void setRequest(HttpServletRequest req);
}

public MyClass implements MyInterface {
   private HttpServletRequest req;

   public void setRequest(HttpServletRequest req) {
      this.req = req;
   }
}

来自 CXF Jira 的 Sergey 的解释是:

这不是一个标准的特定问题,这完全取决于以下事实 提供给运行时的服务对象是一个代理,并且移动 接口的设置器确保此设置器是代理的一部分。 在我的测试中,我在主界面上没有这些设置器 代表服务,但在专用接口上,如 Injectable.Alternatively,至少使用 Spring,启用 Cglib 代理 模式可以提供帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多