@ServerEndpoint不生效的根本原因是WebSocket容器实现缺失或Tomcat未启用WebSocket支持,需确保tomcat-embed-websocket依赖正确、避免spring-boot-starter-websocket干扰、统一使用javax.websocket-api 1.1,并通过ServletContext手动注册端点。
为什么
注解不生效?
根本原因通常是类路径下缺少 WebSocket 容器实现,或者容器(比如 Tomcat)没启用 WebSocket 支持。Spring Boot 2.3+ 默认用的是 Tomcat 9+,但如果你用的是嵌入式 Tomcat,
不会自动扫描——它不走 Spring 的组件扫描机制,而是依赖 Servlet 容器的原生 WebSocket 扩展。
Tomcat 需要确保
在 classpath(Maven 里对应
)
Spring Boot 项目中,若同时引入了
,反而可能干扰原生
,因为该 starter 会注册自己的 WebSocket 配置,覆盖掉容器级支持
IDE 运行时(如 IntelliJ)若用 “Spring Boot Run Configuration”,默认不会激活 Tomcat 的 WebSocket 模块,得手动确认依赖和启动方式
如何让
被 Tomcat 正确加载?
关键不是加注解,而是让 Tomcat 主动发现并注册这个端点。最稳妥的方式是通过
+
手动注册,绕过自动扫描的不可靠性。
在
或
中注册,但更简单的是在
类里写一个
方法,返回
(仅适用于 Spring WebFlux 或老版本 Spring;Spring Boot 2.5+ 已弃用)
推荐做法:不依赖自动扫描,在
中调用
示例片段:
实际上不成立——
不是 Servlet,必须用
构造后交给容器
Maven 依赖冲突导致
编译通过但运行报错
典型错误是
或启动时报
,说明 JSR-356 API 和实现没对齐。
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
确保只有一套 WebSocket API:用
(1.1),不要混用
(2.0+),后者是 Jakarta EE 9+,与 Tomcat 9/10 兼容性有坑
Tomcat 9 对应
,Tomcat 10.1+ 才正式支持
;若强行在 Tomcat 9 里引 jakarta 包,
注解会被忽略且无提示
检查
,删掉重复或版本错配的依赖,尤其是
带来的
和你手动引的冲突
开发调试时容易忽略的容器初始化时机
类的静态块、构造方法、
方法执行顺序,取决于容器何时完成扫描和实例化——它不等 Spring 上下文就绪,所以不能在
里直接注入
Bean。
立即学习
“
Java免费学习笔记(深入)
”;
如果需要访问 Spring Bean,必须通过
手动获取,或改用 Spring 的
+
方案
日志打不出来?因为
可能在 Logback 初始化前执行,建议先用
确认是否进入
路径匹配失败常见于 URL 写成
却在客户端连
,注意上下文路径(context-path)是否影响前缀
事情说清了就结束。真正卡住的往往不是注解本身,而是容器、API 版本、类加载顺序这三者之间的隐式耦合。
@ServerEndpoint@ServerEndpointtomcat-websocket.jarorg.apache.tomcat.embed:tomcat-embed-websocketspring-boot-starter-websocket@ServerEndpoint@ServerEndpointServerEndpointConfig.BuilderServletContext@ServletComponentScanServletContainerInitializer@Configuration@BeanServerEndpointExporterServletContextInitializerserver.getServletContext().addServerEndpoint(...)registry.addServlet(new ServletRegistrationBean<>(new ServerEndpointRegistration(), "/echo"));ServerEndpointRegistrationServerEndpointConfig.Builder.create(MyEndpoint.class, "/echo").build()@ServerEndpointjava.lang.NoClassDefFoundError: javax/websocket/EndpointClassNotFoundException: org.apache.tomcat.websocket.server.WsScijavax.websocket-apijakarta.websocket-apijavax.websocket-api:1.1jakarta.websocket-api:2.1@ServerEndpointmvn dependency:tree -Dincludes=websocketspring-boot-starter-websockettomcat-embed-websocket@ServerEndpoint@OnOpen@OnOpen@AutowiredApplicationContextProviderWebSocketHandlerWebSocketConfigurer@OnOpenSystem.out.println/ws/echows://localhost:8080/echo