Инъекция зависимости 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
s, по одному на каждый порт, и два отдельных Handler
с оберткой отдельно ServletHolder
s, которые отображаются на соответствующие 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);