Spring Boot 2.5.5集成无STOMP原生WebSocket握手类缺失问题求助
问题根因分析
- 版本冲突:Spring Boot 2.5.5默认内置的Tomcat容器版本为9.0.53,你手动在pom中指定了
tomcat-coyote依赖的版本为9.0.31,两者版本不一致,导致Tomcat各组件之间的类引用不匹配,org.apache.coyote.http11.upgrade.UpgradeInfo类在9.0.31版本的包结构和9.0.53版本要求的结构存在差异,触发类找不到异常。 - 引入了不必要的依赖:Spring Boot的
spring-boot-starter-web和spring-boot-starter-websocket已经默认包含了完整的嵌入式Tomcat组件以及Tomcat对WebSocket的支持包,不需要额外手动引入tomcat-coyote依赖,手动引入反而会破坏依赖版本的一致性。 - 配置类存在潜在问题:WebSocket配置类中手动new了被
@Component注解修饰的SocketTextHandler,会导致该Handler脱离Spring的生命周期管理,可能后续引发其他运行异常。
解决方案
通用修复方案(推荐)
- 移除pom.xml中手动引入的
tomcat-coyote依赖,删除以下配置段:
<dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-coyote</artifactId> <version>9.0.31</version> </dependency>
- 修复WebSocket配置类的Handler注入逻辑,从Spring容器中注入Handler实例,修改后的代码如下:
@Configuration @EnableWebSocket public class WebSocketConfiguration implements WebSocketConfigurer { @Autowired private SocketTextHandler socketTextHandler; public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(socketTextHandler, "/ws").setAllowedOrigins("*"); } }
- 清理本地Maven缓存后重新编译启动项目,即可正常完成WebSocket握手连接。
特殊场景方案(需固定使用Tomcat 9.0.31时使用)
如果你确实需要固定使用9.0.31版本的Tomcat,不需要单独引入tomcat-coyote依赖,只需要在pom.xml的<properties>节点中统一指定Tomcat版本即可:
<properties> <tomcat.version>9.0.31</tomcat.version> </properties>
Spring Boot会自动将所有内嵌Tomcat组件的版本统一替换为9.0.31,不会再出现版本冲突问题。
内容的提问来源于stack exchange,提问作者IlyaKudelin
相关产品推荐
相关产品推荐

