代码之家  ›  专栏  ›  技术社区  ›  XeroxDucati

如何正确引导Jersey 2(使用Jetty)?

  •  3
  • XeroxDucati  · 技术社区  · 9 年前

    我已经设法通过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文档引用了一个我应该扩展的Application类,并使用Injections.addBinding设置了绑定。然而,为了做到这一点,他们使用@Inject将ServiceLocator实例获取到构造函数中。然后他们似乎根本没有创建活页夹?( https://jersey.java.net/documentation/latest/migration.html -- 26.14.1.1. 注入自定义对象)。

    是否有人能解释一下我的方法是否正确,也许能启发我Application和ResourceConfig之间的区别,以及我应该做些什么来保持框架的意图一致?

    1 回复  |  直到 9 年前
        1
  •  3
  •   kapex    9 年前

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

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

    你的方法看起来不错。如果只提供其他JAX-RS框架,如RestEasy或ApacheCFX,那么使用Jersey API的特性而不是将自己局限于纯JAX-RS会使在容器环境中运行应用程序变得更加困难。如果您不打算支持其他框架,那么利用Jersey的优势是最好的选择。