【问题标题】:Jersey test dependency injection with Guice使用 Guice 进行 Jersey 测试依赖注入
【发布时间】:2019-07-03 14:14:18
【问题描述】:

我无法将 JerseyTest (v2.25) 与 Guice 依赖注入一起使用。我当前的设置灵感来自另一个 stackoverflow question 的答案。这个设置仍然试图通过 HK2 连接 @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()));
    }
}

【问题讨论】:

    标签: java jersey guice


    【解决方案1】:

    您可以使用现有的库Jersey Guice Module而不是自己编写库

    您需要弥合两个 DI 框架之间的差距。该模块旨在通过启动基于 Jetty 的 Jersey 服务器并初始化 HK2 和 Guice 之间的桥接来实现这一点。

    开始

    • 将 JerseyModule 添加到 Guice 注射器

    • 配置包以扫描资源和要公开的端口

    • 获取 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);
    

    【讨论】:

    • 如何将guice-jersey 与 jersey-test (inmemory) 结合使用?
    猜你喜欢
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多