Java 如何在嵌入式Grizzly Jersey应用程序的main方法中使用HK2注入对象
在使用Jersey设计REST微服务时,我遇到了一个棘手的问题。我正在尝试创建一个带有嵌入式grizzly服务器的应用程序,以降低部署复杂性。因此,我有一个创建grizzly服务器的主要方法。我需要在服务器的引导过程之前注入一些对象 我的主要观点如下:Java 如何在嵌入式Grizzly Jersey应用程序的main方法中使用HK2注入对象,java,java-8,jersey-2.0,hk2,Java,Java 8,Jersey 2.0,Hk2,在使用Jersey设计REST微服务时,我遇到了一个棘手的问题。我正在尝试创建一个带有嵌入式grizzly服务器的应用程序,以降低部署复杂性。因此,我有一个创建grizzly服务器的主要方法。我需要在服务器的引导过程之前注入一些对象 我的主要观点如下: public static void main(String[] args) { App app = new App(new MyResourceConfig()); // Need to inject app here.
public static void main(String[] args) {
App app = new App(new MyResourceConfig());
// Need to inject app here.
app.init(args);
app.start();
}
如何获取ServiceLocator
singleton实例,以便注入我的应用程序对象
我试过:
ServiceLocatorFactory.getInstance()
.create("whatever")
.inject(app);
但是,我需要将所有
AbstractBinder
绑定到它上两次(因为我已经在ResourceConfig
中进行了绑定)。将所有AbstractBinder
绑定到您正在创建的ServiceLocator
上,然后将该定位器传递给Grizzly服务器创建工厂方法之一。这将是Jersey仅从中提取所有服务并将其粘贴到另一个定位器中的父定位器。比如说
ServiceLocator serviceLocator = SLF.getInstance().create(...);
ServiceLocatorUtilities.bind(serviceLocator, new Binder1(), new Binder2());
App app = new App();
serviceLocator.inject(app);
HttpServer server = GrizzlyHttpServerFactory.createHttpServer(
URI.create(BASE_URI),
resourceConfig,
serviceLocator
);
您需要确保您拥有Jersey Grizzly依赖项,而不仅仅是Grizzly
org.glassfish.jersey.containers
注意:
如果您正试图使用GrizzlyWebContainerFactory
创建一个Grizzly servlet容器,那么尝试进行上述工作将很困难。没有工厂方法传递定位器。Jersey确实添加了对属性ServletProperties.SERVICE\u LOCATOR
的支持,但即使如此,属性值也应该是ServiceLocator
。grizzly servlet容器的工厂方法只接受init参数的Map
。该属性实际上是由使用Jetty embedded的第三方贡献者添加的,Jetty embedded确实具有将值设置为对象的init参数的方法。因此,如果您想获得支持,您可能需要向Jersey提交一个问题。为了扩展@peeskillet的伟大答案,在我的场景中,我不得不将Jersey应用程序与其他servlet部署在同一个Grizzly servlet容器中,确实有点痛苦
但后来我找到了救我一天的原因。看看这个请求,我想到的是:
WebappContext webappContext = new WebappContext("myWebappContext");
webappContext.addListener(new ServletContextListener() {
@Override
public void contextInitialized(ServletContextEvent sce) {
sce.getServletContext().setAttribute(ServletProperties.SERVICE_LOCATOR, MY_SERVICE_LOCATOR);
}
@Override
public void contextDestroyed(ServletContextEvent sce) { }
});
ServletRegistration servlet = webappContext.addServlet("myAppplication", new ServletContainer(resourceConfig));
servlet.addMapping("/application/*");
ServletRegistration hello = webappContext.addServlet("myServlet", MyServlet.class);
hello.addMapping("/servlet/*");
HttpServer createHttpServer = GrizzlyHttpServerFactory.createHttpServer(MY_URI, false);
webappContext.deploy(createHttpServer);
createHttpServer.start();
对于以后发现此项的任何人,不再将ServiceLocator作为parameter@tzenes