Tomcat10部署WebSocket Server Endpoints连接失败无法正常工作
问题原因
Tomcat 10及以上版本已经将所有Java EE规范的包名从javax.*迁移为jakarta.*,你当前引入的javax.websocket-api依赖完全不匹配Tomcat 10的类加载规则,@ServerEndpoint注解不会被容器扫描识别,WebSocket端点根本没有完成注册,前端自然连接失败。
另外你写的@OnMessage修饰的方法签名不符合规范,空参数的消息接收方法会直接导致端点初始化失败。
修复步骤
- 替换pom.xml中的WebSocket依赖,删除原有javax版本的依赖,添加Tomcat 10兼容的Jakarta版本依赖:
<dependency> <groupId>jakarta.websocket</groupId> <artifactId>jakarta.websocket-api</artifactId> <version>2.0.0</version> <scope>provided</scope> </dependency>
- 修改WebSocket服务端类的导入包,将所有
javax.websocket开头的导入替换为jakarta.websocket开头的对应类,同时修正onMessage方法的签名,保证方法至少有一个参数用于接收消息内容,修正后的代码参考:
import jakarta.websocket.OnClose; import jakarta.websocket.OnMessage; import jakarta.websocket.OnOpen; import jakarta.websocket.server.ServerEndpoint; @ServerEndpoint("/chat") public class WebsocketServer{ @OnOpen public void onOpen(){} @OnMessage public void onMessage(String message){ // 此处写消息处理逻辑 } @OnClose public void onClose(){} }
- 清理项目中所有残留的
javax.*开头的Java EE相关依赖(比如javax.servlet-api),统一替换为对应Jakarta版本,避免类冲突。 - 执行Maven clean后重新构建项目,重启Tomcat完成部署再测试连接即可。
排查提示
重启部署时注意查看Tomcat的启动日志,如果日志中出现WebsocketServer相关的类加载、端点注册错误,根据报错提示调整即可;如果端点注册成功仍连接失败,先访问
http://localhost:8080/demo_war_exploded/确认项目上下文路径配置正确,不要写错WebSocket连接地址。
内容的提问来源于stack exchange,提问作者Raymond Hou
相关产品推荐
相关产品推荐

