簡體   English   中英

澤西測試依賴注入與Guice

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

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