2017-10-11 72 views
0

我们有一个基于码头9.3和2.7泽西HK2依赖注入在多个servlet

依赖注入正常工作与自带的库捆绑HK2一个REST API服务器。我们通过ResourceConfig注册到应用Handler所需要的服务,并有类似:

handler.addServlet(new ServletHolder("main-api", new ServletContainer(resourceConfig)), MAIN_SERVLET_PATH + "/*");

我们当时就想一些HTTP端点的移动到一个单独的“admin”的端口。因此,我们为每个端口创建了两个单独的ServerConnector s,并为每个相关路径(“/ admin”和“/ api”)创建了两个单独的Handler s,它们分别映射到相应的pathSpecs,并将其分别包装为ServletHolder

问题是,每个处理程序现在都创建一个带有自己的托管服务集的独立ServiceLocator。因此,我们不能在admin和api端点之间共享服务 - 在两个处理程序中定义的单例对象都会创建两次。

尝试在两个ServiceLocators之间创建一个“桥梁” - 但这会导致有限的资源问题。试图创建第三个ServiceLocator并将其连接到另外两个定位器 - 也不是很好。

任何想法如何在Jetty中的不同处理程序之间共享DI对象?或者有一个可以实现上述目标的另一种想法?

+0

不知道是否会工作,但你可以尝试设置[此属性作为一个init-PARAM](HTTPS://jersey.github。 io/apidocs/2.26/jersey/org/glassfish/jersey/servlet/ServletProperties.html#SERVICE_LOCATOR)将创建的定位器作为init-param值传递。 –

回答

0

感谢peeskillet,你的建议确实解决了问题

ContextHandler defaultContext; 
ContextHandler adminContext; 
AbstractBinder sharedSingeltons; 

ServiceLocator sharedServiceLocator = ServiceLocatorUtilities.bind("shared-locator", sharedSingeltons); 
defaultContext.setAttribute(ServletProperties.SERVICE_LOCATOR, sharedServiceLocator); 
adminContext.setAttribute(ServletProperties.SERVICE_LOCATOR, sharedServiceLocator);