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