【问题标题】:HK2 dependency injection in multiple servlets多个 servlet 中的 HK2 依赖注入
【发布时间】:2017-10-11 14:57:03
【问题描述】:

我们有一个基于 Jetty 9.3 和 Jersey 2.7 的 REST API 服务器

依赖注入适用于与库捆绑在一起的 HK2。我们通过ResourceConfig 将所需的服务注册到应用程序Handler 并有类似的东西:

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

然后我们想将一些 HTTP 端点移动到一个单独的“管理”端口。因此,我们为每个相关路径(“/admin”和“/api”)创建了两个独立的ServerConnectors,一个用于每个端口,两个独立的Handlers 包装了映射到相关pathSpecs 的独立ServletHolders )。

问题在于,每个处理程序现在都创建了一个单独的ServiceLocator,并带有自己的一组托管服务。因此,我们无法在 admin 和 api 端点之间共享服务 - 在两个处理程序中定义的 Singleton 对象被创建了两次。

尝试在两个 ServiceLocator 之间创建“桥梁”——但这会导致范围资源出现问题。尝试创建第三个 ServiceLocator 并将其桥接到其他两个定位器 - 也不好。

知道如何在 Jetty 中的不同处理程序之间共享 DI 对象吗?或者对如何实现上述目标有其他想法?

【问题讨论】:

标签: java dependency-injection jersey jetty hk2


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2020-12-20
    相关资源
    最近更新 更多