You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 05:40:08