我正在编写自定义 JAX-RS 2.0 应用程序(在 Jersey 2.3.1 下),它包含一些供所有资源使用的数据。
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 下的行为。注入的对象是 my WebApp
,没有任何包装。我会称之为泽西岛的一个错误。