JAX-RS应用程序子类注入

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成为nullClassCastException所以声明的类型无关紧要。

是泽西岛的虫子还是我的误会?

更新:我检查了RESTEasy 3.0下的行为。注入的对象是my WebApp,没有任何包装。我称它为泽西岛的虫子。

Mic*_*dos 2

这看起来不像是一个错误。根据 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)

  • 引用规范中的“*应用程序提供的应用程序子类的实例*”。特别提到我的“WebApp”。 (2认同)