JAX-RS(Apache CXF)通过setter进行上下文注入

我正在尝试通过Kotlin中的@Context注释将HttpServletRequest注入到我的JAX-RS资源(Apache CXF实现)。 它工作正常,如果我通过方法参数注入它。 但是我不想“乱搞”我的界面,所以我想通过field / setter注入它。

简单字段注入的事情是,代理名称中有$,这是kotlin的一个问题,因为它不能用类名与美元名义工作。

所以我试图通过这个简单的方法通过setter:

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

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

我试图谷歌这个问题,但没有运气。 有没有人有类似的问题,或者有什么我做错了?

顺便说一句我也在CXF的JIRA中创建了一个问题 。

感谢大家评论CXF Jira的问题,我设法解决这个问题。 为了让setter注入与CXF一起工作,你必须在接口中定义setter(不仅在实现类中),还要在那里用@Context注释setter(在接口上)。 我不确定这是否真的符合规范,但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的解释是:

这不是一个标准的特定问题,这完全取决于提供给运行时的服务对象是代理,将setter移动到接口确保这个setter是代理的一部分。 在我的测试中,我没有代表服务的主接口上的这些setter,而是像Injectable这样的专用接口。另外,至少在Spring中,启用Cglib代理模式可以提供帮助。

Interesting Posts