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

SpringBootTest中ServletContext缺失javax.websocket.server.ServerContainer

Spring Boot WebSocket测试:javax.websocket.server.ServerContainer缺失错误解决

问题场景

  • 基于Spring Boot 2.7.3开发WebSocket应用,通过mvn spring-boot:run启动服务时完全正常
  • 执行标注@SpringBootTest的单元测试时,抛出java.lang.IllegalStateException: Attribute 'javax.websocket.server.ServerContainer' not found in ServletContext异常,导致ApplicationContext加载失败
  • 排查确认问题根源是WebSocketConfig类中配置的ServletServerContainerFactoryBean,移除该类内的createWebSocketContainer()方法后,单元测试可正常执行
  • 运行环境:MacOS + OpenJDK 17.0.4

原因解析

ServletServerContainerFactoryBean用于配置WebSocket容器,它依赖ServletContext中存在的javax.websocket.server.ServerContainer属性。但@SpringBootTest默认测试环境不会启动完整的Servlet容器(如Tomcat),因此ServletContext中不存在该属性,触发初始化失败。

解决方案

方案1:测试环境覆盖/排除WebSocket容器配置

在测试类中通过@TestConfiguration覆盖原有的ServletServerContainerFactoryBean配置,让测试环境不加载该Bean:

@SpringBootTest
public class WebSocketTest {

    @TestConfiguration
    static class TestConfig {
        @Bean
        public ServletServerContainerFactoryBean servletServerContainerFactoryBean() {
            return null;
        }
    }

    // 测试方法
    @Test
    void testWebSocket() {
        // 测试逻辑
    }
}

如果WebSocketConfig中仅包含该容器配置,也可直接排除整个配置类:

@SpringBootTest(exclude = WebSocketConfig.class)

注意:若WebSocketConfig内还有其他必要配置,建议优先选择覆盖单个Bean而非排除整个类。

方案2:启动带Servlet容器的测试环境

如果测试需要真实的WebSocket运行环境,可配置@SpringBootTest启动完整的嵌入式Servlet容器:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

这种方式会启动完整的Servlet容器,ServletContext中会自动注入ServerContainer属性,避免异常。

方案3:条件化加载WebSocket容器配置

在WebSocketConfig中使用Spring条件注解,让ServletServerContainerFactoryBean仅在生产环境(非测试环境)加载:

@Configuration
public class WebSocketConfig {

    @Bean
    @ConditionalOnProperty(name = "spring.profiles.active", havingValue = "test", negate = true)
    public ServletServerContainerFactoryBean createWebSocketContainer() {
        ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
        // 自定义WebSocket容器配置,比如消息缓冲区大小
        container.setMaxTextMessageBufferSize(8192);
        container.setMaxBinaryMessageBufferSize(8192);
        return container;
    }
}

当测试环境激活test配置文件时,该Bean不会被初始化,自然不会触发异常。

内容的提问来源于stack exchange,提问作者Phuong Hoang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:45:58