Tomcat Embedded集成WebSocket遇404问题及注解类使用咨询
Tomcat Embedded 11集成WebSocket的404问题排查与注解式实现
404 Not Found问题排查与解决
出现404通常是WebSocket端点未正确注册或路径配置错误,按以下步骤排查:
- 检查端点注解与路径匹配:确认
@ServerEndpoint注解的路径为/ws,测试URL必须和该路径完全一致,注意开头的斜杠不能省略。 - 手动注册WebSocket支持:Tomcat Embedded不会自动扫描注解式端点,必须在启动类中添加WebSocket容器初始化器并注册端点。
- 核对API包与依赖版本:Tomcat 11使用Jakarta EE API(
jakarta.websocket.*),不要使用旧的javax.websocket.*包,确保tomcat-embed-core和tomcat-embed-websocket版本统一为11.0.4。
注解式WebSocket完整示例
1. 注解式WebSocket端点类
import jakarta.websocket.OnClose; import jakarta.websocket.OnMessage; import jakarta.websocket.OnOpen; import jakarta.websocket.Session; import jakarta.websocket.server.ServerEndpoint; @ServerEndpoint("/ws") public class SampleWebSocket { @OnOpen public void onOpen(Session session) { System.out.println("客户端连接: " + session.getId()); } @OnMessage public String onMessage(String message, Session session) { System.out.println("收到消息: " + message); return "收到你的消息: " + message; } @OnClose public void onClose(Session session) { System.out.println("客户端断开: " + session.getId()); } }
2. Tomcat Embedded启动类(正确配置WebSocket)
import org.apache.catalina.Context; import org.apache.catalina.LifecycleException; import org.apache.catalina.startup.Tomcat; import org.apache.tomcat.websocket.server.WsSci; import java.io.File; public class MainClass { public static void main(String[] args) throws LifecycleException { Tomcat tomcat = new Tomcat(); tomcat.setPort(8080); // 创建根上下文 Context context = tomcat.addContext("", new File(".").getAbsolutePath()); // 注册WebSocket容器初始化器,启用WebSocket支持 context.addServletContainerInitializer(new WsSci(), null); // 注册WebSocket处理Servlet,映射所有路径 Tomcat.addServlet(context, "wsServlet", new org.apache.tomcat.websocket.server.WsServlet()); context.addServletMappingDecoded("/*", "wsServlet"); tomcat.start(); tomcat.getServer().await(); } }
额外注意事项
- Maven依赖配置示例:
<dependencies> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> <version>11.0.4</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-websocket</artifactId> <version>11.0.4</version> </dependency> </dependencies>
- 测试时执行命令
websocat ws://localhost:8080/ws,发送消息即可验证连接是否正常。
内容的提问来源于stack exchange,提问作者mah454
相关产品推荐
相关产品推荐

