我正在编写自定义的JAX-RS 2.0应用程序(在Jersey 2.3.1下),其中包含一些供所有资源使用的数据。JAX-RS应用程序子类注入
public class WebApp extends org.glassfish.jersey.server.ResourceConfig {
public WebApp() {
packages("my.resources.package");
}
}
(我可以使用API的javax.ws.rs.core.Application
为好,所描述的结果是一样的)
然后我注入的对象转化为资源
@Path("test")
public class Test {
@Context
Application app;
@GET
@Path("test")
public String test() {
return "Application class: " + app.getClass();
}
}
然而,调用的结果是
Application class: class org.glassfish.jersey.server.ResourceConfig$WrappingResourceConfig
这使我使用一些丑陋的技巧,如
if (app instanceof WebApp) {
return (WebApp) app;
} else if (app instanceof ResourceConfig) {
return (WebApp) ((ResourceConfig) app).getApplication();
}
我JAX-RS 2.0规范9.2.1节的理解:
应用程序提供的
Application
子类的实例可以被注入到使用@Context
注释的类域或方法参数。访问Application
子类实例允许配置信息集中在该类中。请注意,这不能注入Application
子类本身,因为这会创建循环依赖关系。
是应用程序提供的子类Application
是矿WebApp
,不JAX-RS特定于实现的包装。
此外,更改该片段
@Context
Application app;
此
@Context
WebApp app;
导致app
上下文注射期间为null
,由于ClassCastException
,所以声明的类型并不重要。
这是泽西岛的一个错误还是我的误解?
更新:我检查了RESTEasy 3.0下的行为。注入的对象是我的WebApp
,没有任何包装。我会把它称为泽西岛的一个bug。
你能向我们展示'ClassCastException'吗? –
对不起,现在无法检测到。但是当我调试这个问题的时候,我相信它是存在的(可能仍然是Jersey 2.2),并且这个例外是由于将'ResourceConfig $ WrappingResourceConfig'映射到我的'WebApp'。这个例外正在被捕获,并且没有进行调查。 – pwes