Jersey 2 和 Guice integration:.getServiceLocator() 方法在哪里



我正在尝试将基于 Jersey 1.19 的现有 Rest API 迁移到 Jersey 2.26,该 API 使用 Guice for DI。我在网上没有找到太多涉及这个主题的话题。我遇到的少数人提到泽西 2 有自己的 DI 机制,称为 HK2,需要在 Guice 和 HK2 之间创建一个桥梁,就像这里这个存储库中提到的:https://github.com/caberger/jerseyguice 和这篇文章在这里 http://www.aberger.at/en/blog/design/2016/11/17/bridge-jersey2-guice.html。该示例使用 Jersey 2.24,在 DI 逻辑中,有以下语句:

ServletContainer servletContainer = (ServletContainer)container;
        ServiceLocator serviceLocator = container.getApplicationHandler().getServiceLocator();
        GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
        GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
        Injector injector = (Injector) servletContainer.getServletContext().getAttribute(Injector.class.getName());
        guiceBridge.bridgeGuiceInjector(injector);

问题是 container.getApplicationHandler().getServiceLocator(); 语句不再有效,因为方法 .getServiceLocator() 已从 Jersey 2.24 删除到 2.26,没有任何提及。

如果有人对如何执行相同的操作有任何见解,或者对如何将Guice连接到泽西岛2.26有不同的想法,那将不胜感激。

我最终没有使用jerseyguice桥。我正在发布我自己的问题的答案,也许这会帮助某人。我所做的是在所有服务中使用com.google.inject.Inject,原因是com.google.inject.Inject没有被HK2捕获。对于所有资源类(用@Path注释),我使用了javax.inject.Inject注释。我保留了我原来的Guice模块,然后我创建了一个桥接HK2模块:

  @ApplicationPath("/app")
public class Application extends ResourceConfig {
 public Application() {
    packages("com.app");
   Injector injector = Guice.createInjector(
     new MyOriginalGuiceModule(),
     new MyOriginalGuiceModule2());
   register(new HK2BridgeModule(injector));
  }
}

然后:

public class HK2BridgeModule extends AbstractBinder {
  private final Injector guiceInjector;
  public HK2BridgeModule(Injector guiceInjector) {
    this.guiceInjector = guiceInjector;
  }
  @Override
  protected void configure() {
    //Here are only the services needed by the resources, they are pulled from guice injector using the factory
    bindFactory(new ServiceFactory<Service1>(guiceInjector, Service1.class)).to(Service1.class);
    //...all your services here
  }
  //this will allow HK2 to pull dependencies from guice injector
  private static class ServiceFactory<T> implements Factory<T> {
    private final Injector guiceInjector;
    private final Class<T> serviceClass;
    public ServiceFactory(Injector guiceInjector, Class<T> serviceClass) {
      this.guiceInjector = guiceInjector;
      this.serviceClass = serviceClass;
    }
    @Override
    public T provide() {
      return guiceInjector.getInstance(serviceClass);
    }
    @Override
    public void dispose(T versionResource) {
    }
  }
}

它完成了这项工作。

您不需要 Guice-HK2 桥接器即可集成 Guice 和 Jersey。这是没有桥接的 Web 服务器实现 -https://github.com/sorskod/webserver。

但是,如果您仍然想使用 bridge,请注意,从 Jersey 2.26 开始,您需要显式提供 DI 实现,目前仅完全支持 HK2。也许添加jersey-hk2可以帮助您摆脱异常。

<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-hk2</artifactId>
    <version>2.26</version>
</dependency>

最新更新