[英]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.