我已经设法通过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文档引用了我应该扩展的Application类,并使用Injections.addBinding设置绑定。但是为了做到这一点,他们不知何故使用@Inject将ServiceLocator实例添加到他们的构造函数中。然后他们似乎根本没有创造一个Binder? (https://jersey.java.net/documentation/latest/migration.html - 26.14.1.1。注入自定义对象)。
有人可以说明我的方法是否正确,也许可以告诉我应用程序和ResourceConfig之间的区别是什么以及我应该做些什么来保持与其所针对的内容保持一致框架?
答案 0 :(得分:3)
Application
是JAX-RS的一部分,JAX-RS是由Java EE规范定义的REST API。 Jersey是该API的一种实现。因此,您可以使用标准Application
来设置与JAX-RS定义的Jersey应用程序。 ResourceConfig
扩展Application
,是泽西岛特定于实施的增强功能。它允许更容易的设置,例如添加注射或添加要扫描的包,就像在代码中一样。
链接文档确实使用了活页夹。没有的例子是指老泽西岛1.x.我认为其他示例使用org.glassfish.jersey.internal.inject.Injections
类,它是(如包名称所暗示的)不应使用的内部类。我不知道他们为什么在文档中包含它,它认为不应该存在。也许它曾经是公共API的一部分,或者没有其他方法来完成示例。无论如何,最好不要使用那个类。
你的方法看起来很好。使用Jersey API的功能而不是限制自己使用纯JAX-RS可以使您的应用程序在容器环境中运行更加困难,如果它们只提供其他JAX-RS框架,如RestEasy或Apache CFX。如果您不打算支持其他框架,那么利用Jersey的优势就可以了。