我正在编写自定义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的理解:
The instance of the application-supplied
Application
subclass can be injected into a class field or method parameter using the@Context
annotation. Access to theApplication
subclass instance allows configuration information to be centralized in that class. Note that this cannot be injected into theApplication
subclass itself since this would create a circular dependency.
是应用程序提供的Application子类是我的WebApp,而不是JAX-RS特定于实现的包装器.
另外,改变这个片段
@Context
Application app;
对此
@Context
WebApp app;
由于上下文注入期间的ClassCastException,导致app为null,因此声明的类型无关紧要.
这是泽西岛的一个错误还是我的误解?
更新:我检查了RESTEasy 3.0下的行为.注入的对象是我的WebApp,没有任何包装器.我把它称为泽西岛的一个错误.
解决方法:
这似乎不是一个错误.根据JAX-RS 2.0规范,您可以将Application注入您的资源类(例如),但它没有说明直接注入Application的自定义扩展.不确定您的用例是什么,但您可以注册自定义HK2 binder,这将允许您直接将WebApp注入资源:
public class WebApp extends org.glassfish.jersey.server.ResourceConfig {
public WebApp() {
packages("my.resources.package");
register(new org.glassfish.hk2.utilities.binding.AbstractBinder() {
@Override
protected void configure() {
bind(WebApp.this);
}
});
}
}