jersey - 引导 Jersey 2(使用 Jetty)的正确方法是什么?

标签 jersey jetty jersey-2.0 embedded-jetty hk2

我已经成功地通过 HK2 注入(inject)破解了泽西/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 设置绑定(bind)。然而,为了做到这一点,他们以某种方式使用 @Inject 将 ServiceLocator 实例获取到其构造函数中。然后他们似乎根本没有创建 Binder? ( https://jersey.java.net/documentation/latest/migration.html -- 26.14.1.1.注入(inject)自定义对象)。

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

最佳答案

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

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

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

关于jersey - 引导 Jersey 2(使用 Jetty)的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28270431/

相关文章:

java - Jersey 2.0 的依赖注入(inject)

使用visualvm分析 jetty 非常慢

jax-rs - Weblogic12c支持jersey 2.x吗?

java.sql.TimeStamp 没有默认构造函数

java - 如何将 Jersey REST 服务器部署到 Heroku

ssl - 向 Jetty 服务器 Clojure 添加 SSL 支持时出错

java - 如何配置 jetty 与 Guice 和 Vaadin 一起运行

maven - 如何将 Swagger 无配置设置与 Jersey 2 集成

java - Set-Cookie header 不在 Internet Explorer 中设置 cookie

java - Jersey 2 : Consumes APPLICATION_FORM_URLENCODED and MULTIPART_FORM_DATA together