使用configureDeployment时如何为JerseyTest注入Spring应用上下文?
解决JerseyTest + GrizzlyWebTestContainerFactory下Spring上下文注入失效问题
问题出在ServletDeploymentContext的配置没有正确关联Spring上下文。当使用GrizzlyWebTestContainerFactory构建Servlet环境时,单纯给ResourceConfig设置contextConfig属性无法让Spring集成生效,因为Servlet环境下需要通过Spring的ContextLoaderListener来初始化并关联上下文,而非直接通过Jersey的ResourceConfig传递。
修正后的测试类代码
public class TestResourceIntegrationTest extends JerseyTest { private AnnotationConfigApplicationContext springContext; @Override protected DeploymentContext configureDeployment() { // 初始化Spring上下文 springContext = new AnnotationConfigApplicationContext(); springContext.register(TestService.class); springContext.refresh(); ResourceConfig config = new ResourceConfig(TestResource.class); return ServletDeploymentContext .builder(config) // 注册Spring ContextLoaderListener,关联自定义上下文 .listener(new ContextLoaderListener() { @Override protected WebApplicationContext createWebApplicationContext(ServletContext sc) { sc.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, springContext); return springContext; } }) // 无需手动创建ServletContainer,让DeploymentContext自动处理 .build(); } @Override protected TestContainerFactory getTestContainerFactory() { return new GrizzlyWebTestContainerFactory(); } @Test public void test_get_request() { Response response = target("/test").request().get(); assertEquals(200, response.getStatus()); } // 测试结束后关闭Spring上下文,避免内存泄漏 @Override public void tearDown() throws Exception { super.tearDown(); if (springContext != null) { springContext.close(); } } }
关键改动说明
- 注册ContextLoaderListener:通过自定义
ContextLoaderListener,将我们初始化的Spring上下文绑定到ServletContext中,这样Jersey的Spring集成就能从ServletContext中获取到正确的上下文实例。 - 移除手动创建的ServletContainer:原来手动创建
ServletContainer(config)会导致ResourceConfig被重复初始化,上下文无法共享,让ServletDeploymentContext自动创建ServletContainer即可。 - 添加上下文销毁逻辑:在
tearDown中关闭Spring上下文,避免测试后内存泄漏。
为什么configure方法能正常工作?
当重写configure方法使用默认测试容器时,Jersey运行在非Servlet环境下,Spring集成直接通过ResourceConfig的contextConfig属性加载上下文,不需要遵循Servlet规范的Listener初始化流程,所以能正常注入依赖。
内容的提问来源于stack exchange,提问作者user16540816
相关产品推荐
相关产品推荐

