【发布时间】:2013-11-14 20:12:55
【问题描述】:
我正在编写自定义 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;
由于在上下文注入期间ClassCastException,导致app 为null,因此声明的类型无关紧要。
这是泽西岛的错误还是我的误解?
更新:我检查了 RESTEasy 3.0 下的行为。注入的对象是我的WebApp,没有任何包装。我会称其为泽西岛的错误。
【问题讨论】:
-
你能告诉我们
ClassCastException吗? -
抱歉,现在检测不到。但我确信它在我调试问题时存在(可能仍然是 Jersey 2.2),异常是由于将
ResourceConfig$WrappingResourceConfig映射到我的WebApp。异常被捕获并且没有执行。
标签: java jersey jax-rs jersey-2.0