2017-10-11 89 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);