我已经成功地通过 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/