pwe*_*wes 5 java jax-rs jersey jersey-2.0
我正在编写自定义JAX-RS 2.0应用程序(在Jersey 2.3.1下),其中包含一些供所有资源使用的数据。
public class WebApp extends org.glassfish.jersey.server.ResourceConfig {
public WebApp() {
packages("my.resources.package");
}
}
Run Code Online (Sandbox Code Playgroud)
(我也可以使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,通话结果是
Application class: class org.glassfish.jersey.server.ResourceConfig$WrappingResourceConfig
Run Code Online (Sandbox Code Playgroud)
这让我用了一些丑陋的把戏
Application class: class org.glassfish.jersey.server.ResourceConfig$WrappingResourceConfig
Run Code Online (Sandbox Code Playgroud)
我对JAX-RS 2.0规范第9.2.1节的理解:
Application可以使用@Context注释将应用程序提供的子类的实例注入到类字段或方法参数中。对子Application类实例的访问允许将配置信息集中在该类中。注意,不能将其注入Application子类本身,因为这将创建循环依赖。
是应用程序提供的Application子类是mine WebApp,而不是JAX-RS实现特定的包装器。
此外,更改此片段
if (app instanceof WebApp) {
return (WebApp) app;
} else if (app instanceof ResourceConfig) {
return (WebApp) ((ResourceConfig) app).getApplication();
}
Run Code Online (Sandbox Code Playgroud)
对此
@Context
Application app;
Run Code Online (Sandbox Code Playgroud)
由于在上下文注入期间导致app成为null,ClassCastException所以声明的类型无关紧要。
是泽西岛的虫子还是我的误会?
更新:我检查了RESTEasy 3.0下的行为。注入的对象是my WebApp,没有任何包装。我称它为泽西岛的虫子。
这看起来不像是一个错误。根据 JAX-RS 2.0 规范,您可以注入Application资源类(例如),但它没有说明直接注入Application. 不确定您的用例是什么,但您可以注册自定义 HK2绑定器,它允许您直接注入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);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3721 次 |
| 最近记录: |