[英]Jersey test dependency injection with Guice
我無法使用JerseyTest(v2.25)和Guice依賴注入。 我目前的設置靈感來自另一個stackoverflow問題的答案。 此設置仍嘗試通過HK2連接@Provides
注釋類的依賴關系, @Provides
我的測試用例失敗。 如果我從我的測試ResourceConfig
刪除.packages()
調用,似乎根本沒有初始化監聽器,我的測試用例都返回404。
這是我目前的球衣測試設置:
public class MyTestSuite extends JerseyTest {
@Override
protected Application configure() {
return new ResourceConfig().packages("com.example.api");
}
@Override
protected DeploymentContext configureDeployment() {
return ServletDeploymentContext.builder(configure())
.addListener(GuiceConfig.class)
.addFilter(GuiceFilter.class, "guiceFilter")
.addFilter(ServletContainer.class, "jerseyFilter", Collections.singletonMap("javax.ws.rs.Application", JerseyConfig.class.getName()))
.build();
}
}
以下是部署上下文中引用的類:
public class GuiceConfig extends GuiceServletContextListener {
static Injector injector;
@Override
protected Injector getInjector() {
injector = Guice.createInjector(new WebModule());
return injector;
}
}
public class JerseyConfig extends ResourceConfig {
@Inject
public JerseyConfig(ServiceLocator serviceLocator) {
Injector injector = (Injector) serviceLocator.getService(ServletContext.class).getAttribute(Injector.class.getName());
GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
serviceLocator.getService(GuiceIntoHK2Bridge.class).bridgeGuiceInjector(injector.createChildInjector(new HK2IntoGuiceBridge(serviceLocator)));
packages("com.example.api");
}
}
public class WebModule extends ServletModule {
@Override
protected void configureServlets() {
serve("/*").with(ServletContainer.class, Collections.singletonMap(ServletProperties.JAXRS_APPLICATION_CLASS, JerseyConfig.class.getName()));
}
}
您可以使用現有的Jersey Jersey Guice模塊 ,而不是自己編寫
你需要彌合兩個DI框架之間的差距。 該模塊旨在通過啟動基於Jetty的Jersey服務器並初始化HK2和Guice之間的橋梁來實現這一目標。
入門
將JerseyModule添加到您的Guice Injector
配置程序包以掃描資源和要公開的端口
獲取JerseyServer的實例並開始使用Restful資源
compile 'io.logz:guice-jersey:1.0.8'
請注意,您缺少GuiceIntoHK2Bridge
Injector injector = (Injector) servletContext.getAttribute(Injector.class.getName()); GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator); GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class); guiceBridge.bridgeGuiceInjector(injector);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.