【问题标题】:What's the right way to bootstrap Jersey 2 (with Jetty)?引导 Jersey 2(使用 Jetty)的正确方法是什么?
【发布时间】:2015-03-31 23:13:26
【问题描述】:

我已经设法通过 HK2 注入破解了一个有效的 Jersey/Jetty 设置,但鉴于我发现大量有些令人困惑(有时不一致)的文档,我不确定我是否'我错过了一些正确的重要细节。就目前而言,我正在像这样引导 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 之间的区别以及我应该实际做些什么来与框架的意图保持一致?

【问题讨论】:

    标签: jersey jetty jersey-2.0 embedded-jetty hk2


    【解决方案1】:

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

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

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

    【讨论】:

    • 出于好奇,纯 JAX-RS 方法会是什么样子?我可以将 ResourceConfig 换成 Application 吗?
    • @XeroxDucati 是的,您也只能导入 JAX-RS API 而不是 Jersey 或任何其他框架。但是,纯 JAX-RS 受到更多限制,因此您必须为 jersey 提供的功能找到替代解决方案。您需要使用 web.xml 或标准定义的任何其他配置方式,而不是在 ResourceConfig 中进行配置。
    猜你喜欢
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2016-10-27
    • 2019-09-04
    • 2016-01-11
    • 2019-09-14
    相关资源
    最近更新 更多