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
相关产品推荐
相关产品推荐

