我正在开发一个应用程序,它使用 Jersey (2.5) 作为其 REST 前端,使用 Jetty 作为嵌入式 HTTP(S) 服务器,两者都以所谓的“嵌入式”方式,例如。无需借助 .war 和部署它,而是通过处理程序、资源、注入(inject)的编程配置...

我想以某种方式覆盖 Jersey 在服务器端使用的 HK2 ServiceLocator,或者可能为这个服务定位器提供一个父级来解决在应用程序的 REST 部分之外定义的依赖项。从我看到的代码来看,这似乎是不可能的: ServiceLocator 是通过调用 ApplicationHandlerInjections 内部实例化的:

if (customBinder == null) {
        this.locator = Injections.createLocator(new ServerBinder(application.getProperties()), new ApplicationBinder());
    } else {
        this.locator = Injections.createLocator(new ServerBinder(application.getProperties()), new ApplicationBinder(),
                                                customBinder);
    }

Injections 中的代码告诉我以下内容:
 public static ServiceLocator createLocator(Binder... binders) {
    return _createLocator(null, null, binders);
 }

这意味着新创建的服务定位器具有一些任意生成的名称并且没有父级。

有没有一种(干净的)方法来改变这种行为,以便我将自己的 ServiceLocator 作为应用程序的父级注入(inject)?

最佳答案

我知道这个答案有点晚了。我遇到了同样的问题,但在 Dropwizard 框架中。经过一些调试,我看到了一些让我高兴的代码行!

final ServiceLocator locator = (ServiceLocator) webConfig.getServletContext()
            .getAttribute(ServletProperties.SERVICE_LOCATOR);

这段代码位于 jerseyes WebComponent 构造函数内部。所以解决方案是为您的 ServletContext 提供 ServletProperties.SERVICE_LOCATOR。在Dropwizard环境中,我通过做
environment.getApplicationContext().getAttributes().setAttribute(ServletProperties.SERVICE_LOCATOR, locator);

10-06 13:59