当前位置: 首页 > 知识库问答 >
问题:

JAX-遥感应用子类注入

呼延博易
2023-03-14

我正在编写自定义JAX-RS 2.0应用程序(在泽西岛2.3.1下),其中包含一些数据供所有资源使用。

public class WebApp extends org.glassfish.jersey.server.ResourceConfig {
    public WebApp() {
        packages("my.resources.package");
    }
}

(我也可以使用API的< code > 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节的理解:

可以使用 @Context 注释将应用程序提供的 Application 子类的实例注入到类字段或方法参数中。对应用程序子类实例的访问允许将配置信息集中在该类中。请注意,这不能注入到应用程序子类本身中,因为这将创建循环依赖项。

应用程序提供的Application子类是我的WebApp,而不是特定于JAX-RS实现的包装器。

同样,改变这个片段

    @Context
    Application app;

到这个

    @Context
    WebApp app;

由于上下文注入期间出现类转换异常,导致应用为空,因此声明的类型无关紧要。

这是泽西岛的错误还是我的误解?

更新:我检查了RESTEasy 3.0下的行为。注入的对象是我的< code>WebApp,没有任何包装器。我把它叫做泽西的臭虫。

共有3个答案

谷梁迪
2023-03-14

这似乎在更高版本的og jer中得到了修复。同样的方法至少对我来说适用于jer2.16。我注入的Application对象是正确的子类,没有任何包装。

编辑:也可能版本终究无关紧要。请看这个回答的评论。

姜钧
2023-03-14

我在使用球衣2.4.1时也遇到过这种情况。

FWIW:我同意根据规范第8.2.1段,这似乎是一个错误。语句“应用程序提供的应用程序子类的实例”似乎非常清楚。

我有一个替代的解决方法,它不涉及玻璃鱼.hk2,但仍然将泽西岛特定的代码集中在应用程序派生的类中。

public class MyApp extends ResourceConfig {
...
    static MyApp getInstance( Application application) {
        try {
            // for a conformant implementation
            return (MyApp) application;
        } catch (ClassCastException e) {
            // Jersey 2.4.1 workaround
            ResourceConfig rc = (ResourceConfig) application;
            return (MyApp) rc.getApplication();
        }
    }
...
}

public class MyResource {
...
    @Context Application application;
    ...
    SomeMethod() {
    ... MyApp.getInstance( application);
    }
}

希望这是有用的。

梁丘佑运
2023-03-14

这看起来不像是bug。根据JAX-RS 2.0规范,你可以将< code>Application注入到你的资源类中(举例来说),但是它并没有说直接注入< code>Application的自定义扩展。不确定您的用例是什么,但您可以注册自定义HK2绑定器,这样您就可以直接将< code>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);
            }
        });
    }
}
 类似资料:
  • 我正试图在Tomcat 7.0.34.0上使用Servlet3.0应用程序类开发一个RESTful webapp,但似乎没有任何工作。我对以前的应用程序使用Jersey ServletContainer方法并在web.xml中声明所有REST服务没有任何问题。 我的当前应用程序子类: 和web服务: 当我尝试部署应用程序时,Tomcat告诉我上下文已重新加载: web应用程序本身已经部署(我可以访

  • 我已经在SO和官方文档上搜索了一段时间,但我找不到直接将CDI注入JAX-RS客户端的方法。 我使用builder方法检索一个客户机,并想注册一个< code>WriterInterceptor(或任何类似过滤器的组件),它使用注入来检索另一个bean。 我想使用CDI注入,并避免向HK2注册每个bean。 和MyWriter与注入的类。 我在一个带有泽西2和焊接SE的嵌入式码头上运行。

  • 我正在将JAX-RS应用程序从WebSphere 8.0迁移到WebSphere Liberty 8.5.5。 在WebSphere 8.0中,Jackson是由WebSphere提供的。我可以在AppServer\plugins\目录中找到、、和文件。 在新的应用服务器(WebSphere Liberty)中,我得到以下异常:< code > org . code Haus . Jackson

  • 所以我使用的是与JBoss捆绑在一起的RESTEasy。 类是: …最后,在类中,我有以下内容: 我的问题是: 为什么注射失败? 我有点厌倦了注释魔术在运行时失败,有没有一种方法可以不使用注释就获得? 或者,我的类是否可以获得并将其作为构造函数参数传递给类? 如果所有其他方法都失败了,我想我总是可以使用?自己读取和解析web.xml文件

  • 我正在迁移一个遗留服务框架,该框架使用java序列化/反射来注册服务,并将它们作为远程endpoint(javabin over http)或本地调用无缝地调用。我已经将远程调用替换为jerseyendpoint。并使用基于hk2 aop的拦截器重新构建了现有框架的部分拦截能力。当远程客户端调用endpoint时,它工作正常。现在,我需要对服务方法的本地调用执行相同的操作,并且能够使用与远程服务方

  • 我正在移动应用程序到,其中一部分工作是重构来自至。我想将现有的结构化日志数据传递给ApplicationInsights。 称之为: 生成应用程序洞察数据,包括和-yay的自定义维度。 称之为: 在哪里: 不会在Application Insights中生成任何属性。 所以是接口。这只是一个模拟;我真正想利用的是微软的等价物。实践。企业图书馆。伐木。LogEntry. 我的下一步是设置自定义,将属