3

我已经设法通过 HK2 注入破解了我的工作泽西/码头设置,但鉴于我发现大量有些令人困惑(有时不一致)的文档,我不确定我是否错过了一些正确处理的重要细节..就目前而言,我正在像这样引导servlet;

        // Jersey
        ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
        ServletContainer jerseyServletContainer = new ServletContainer(new AppResourceConfig());
        ServletHolder jerseyServletHolder = new ServletHolder(jerseyServletContainer);
        servletContextHandler.setContextPath("/");
        servletContextHandler.addServlet(jerseyServletHolder, "/api/*");

        // Wire up Jetty
        HandlerCollection handlerList = new HandlerCollection();
        handlerList.setHandlers(new Handler[]{ servletContextHandler });
        Server server = new Server(configuration.getInt("Server.Port"));
        server.setHandler(handlerList);
        server.start();
        server.join();

我将我的 AppResourceConfig 定义为;

public class AppResourceConfig extends ResourceConfig {
    public AppResourceConfig() {
        register(new AppBinder());
        packages("org.sandbox.resources");
    }
}

和我的 AppBinder 一样;

public class AppBinder extends AbstractBinder {
    @Override
    protected void configure() {
        bind(new StringService()).to(StringService.class);
    }
}

这一切都适用于我的简单测试用例,但我不清楚一些事情。Jersey 文档引用了一个我应该扩展的应用程序类,并使用 Injections.addBinding 设置绑定。然而,为了做到这一点,他们以某种方式使用 @Inject 将 ServiceLocator 实例放入他们的构造函数中。然后他们似乎根本没有创建活页夹?(https://jersey.java.net/documentation/latest/migration.html -- 26.14.1.1. 注入自定义对象)。

有人可以阐明我的方法是否正确,也许可以启发我了解 Application 和 ResourceConfig 之间的区别以及我实际上应该做什么以与框架的意图保持一致?

4

1 回答 1

3

Application是 JAX-RS 的一部分,JAX-RS 是由 Java EE 规范定义的 REST API。Jersey 是该 API 的一种实现。因此,您可以使用ApplicationJAX-RS 定义的标准来设置带有 Jersey 的 REST 应用程序。ResourceConfig扩展Application并且是由 Jersey 实现的特定增强。它允许更轻松的设置,例如添加注入或添加要扫描的包,就像您在代码中所做的那样。

链接的文档确实使用了活页夹。不是指旧的 Jersey 1.x 的示例。我认为其他示例使用的org.glassfish.jersey.internal.inject.Injections类(正如包名所暗示的)是不应使用的内部类。我不知道他们为什么将其包含在文档中,它认为不应该存在。也许它曾经是公共 API 的一部分,或者没有其他方法可以完成示例。无论如何,最好不要使用那个类。

你的方法看起来不错。如果仅提供其他 JAX-RS 框架(如 RestEasy 或 Apache CFX),则使用 Jersey API 的功能而不是将自己限制为纯 JAX-RS 会使您的应用程序在容器环境中的运行更加困难。如果您不打算支持其他框架,那么利用 Jersey 的优势是不错的选择。

于 2015-02-02T12:02:35.283 回答