簡體   English   中英

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

[英]Jersey 2 and Guice integration: where is .getServiceLocator() method

我正在嘗試將基於 Jersey 1.19 的現有 Rest API 遷移到 Jersey 2.26,該 API 使用 Guice for DI。 我沒有在網上找到很多與該主題相關的主題。 我遇到的少數人提到 Jersey 2 有自己的稱為 HK2 的 DI 機制,需要在 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 連接到 Jersey 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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM