Инъекция зависимости 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". Итак, мы создали два отдельных ServerConnectors, по одному на каждый порт, и два отдельных Handlerс оберткой отдельно ServletHolders, которые отображаются на соответствующие pathSpecs для каждого соответствующего пути ("/admin" и "/api").

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

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

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

1 ответ

Спасибо Paul Samsotha, ваше предложение действительно решило проблему

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);
Другие вопросы по тегам