跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

如何配置Java的WebSocket开发环境_ServerEndpoint注解支持

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

相关文章