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

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的生命周期管理,可能后续引发其他运行异常。
解决方案

通用修复方案(推荐)

  1. 移除pom.xml中手动引入的tomcat-coyote依赖,删除以下配置段:
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-coyote</artifactId>
    <version>9.0.31</version>
</dependency>
  1. 修复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("*");
    }
}
  1. 清理本地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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:24:04