Внедрение зависимостей HK2 в несколько сервлетов

У нас есть сервер REST API на основе Jetty 9.3 и Jersey 2.7.

Внедрение зависимостей отлично работает с HK2, который поставляется в комплекте с библиотеками. Мы регистрируем необходимые службы в приложении Handler через ResourceConfig и имеем что-то вроде:

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

Затем мы хотели переместить некоторые конечные точки HTTP на отдельный порт «admin». Поэтому мы создали два отдельных ServerConnector, по одному для каждого порта, и два отдельных Handler, обертывающих отдельные ServletHolder, которые сопоставляются с соответствующими путями для каждого соответствующего пути ("/admin" и "/api").

Проблема в том, что каждый из обработчиков теперь создает отдельный ServiceLocator со своим набором управляемых сервисов. Таким образом, мы не можем совместно использовать службы между конечными точками администратора и API — объекты Singleton, определенные в обоих обработчиках, создаются дважды.

Попытался создать «мост» между двумя ServiceLocators, но это вызывает проблемы с ограниченными ресурсами. Попытался создать третий ServiceLocator и соединить его с двумя другими локаторами - тоже нехорошо.

Любые идеи, как можно обмениваться объектами DI между отдельными обработчиками в Jetty? Или есть альтернативное представление о том, как можно достичь вышеперечисленного?


person Noam Barkai    schedule 11.10.2017    source источник
comment
Не уверен, что это сработает, но вы можете попробовать установить это свойство в качестве параметра инициализации, передавая созданный вами локатор в качестве значения параметра инициализации.   -  person Paul Samsotha    schedule 11.10.2017


Ответы (1)


спасибо 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);
person Noam Barkai    schedule 18.10.2017