2017-10-11 3 views
0

Wir haben einen REST-API-Server auf Jetty basierend haben 9,3 und 2,7 JerseyHK2 Dependency Injection in mehreren Servlets

Dependency Injection mit HK2 gut arbeitet, die mit dem Libs mitgeliefert werden. Wir registrieren die benötigten Dienste für die Anwendung Handler über eine ResourceConfig und haben so etwas wie:

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

wir dann wollten einige der HTTP-Endpunkte auf einem separaten „admin“ Port bewegen. Also haben wir zwei separate ServerConnector s, einen für jeden Port, und zwei separate Handler s, die separate ServletHolder s enthalten, die den relevanten pathSpecs zugeordnet sind, für jeden relevanten Pfad ("/ admin" und "/ api").

Das Problem ist, dass jeder der Handler jetzt einen separaten ServiceLocator mit seiner eigenen Reihe von verwalteten Diensten erstellt. Wir können somit keine Dienste zwischen Admin- und API-Endpunkten teilen - Singleton-Objekte, die in beiden Handlern definiert sind, werden zweimal erzeugt.

Es wurde versucht, eine "Brücke" zwischen den beiden ServiceLocators zu erstellen - dies verursacht jedoch Probleme mit den Ressourcen im Bereich. Versuchte, einen dritten ServiceLocator zu erstellen und ihn mit den beiden anderen Locators zu verbinden - auch nicht gut.

Irgendwelche Ideen, wie man DI-Objekte zwischen verschiedenen Handlern in Jetty teilen kann? Oder haben Sie eine alternative Idee, wie das oben genannte erreicht werden kann?

+0

Nicht sicher das Problem gelöst, wenn es funktioniert, aber Sie können festlegen versuchen [diese Eigenschaft als eine init-param] (https: //jersey.github. io/apidocs/2.26/jersey/org/glassfish/jersey/servlet/ServletProperties.html # SERVICE_LOCATOR) übergeben Sie den erstellten Locator als init-param-Wert. –

Antwort

0

dank peeskillet, in die Tat Ihr Vorschlag

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);