Spring WebSocket 错误
内容提要
JSR-356容器握手失败可能是由于Spring MVC默认使用不匹配的WebSocketContainer。解决方法包括显式注入JSR-356容器或切换到Reactor Netty客户端,并确保配置类添加@EnableWebSocket以避免循环依赖。Spring Boot 3.x使用jakarta.websocket,需统一依赖版本以防冲突。常见错误有循环依赖、无效JSON和空指针异常。
关键要点
-
JSR-356容器握手失败的现象包括控制台没有afterConnectionEstablished日志,客户端卡在握手阶段或报错超时。
-
握手失败的原因是Spring MVC默认使用的StandardWebSocketClient未指定底层WebSocketContainer,导致与嵌入式Tomcat不匹配。
-
解决方法包括显式注入JSR-356容器或切换到Reactor Netty客户端,并确保配置类添加@EnableWebSocket以避免循环依赖。
-
Spring Boot 3.x使用jakarta.websocket,需统一依赖版本以防冲突。
-
常见错误包括循环依赖、无效JSON和空指针异常,需通过@Lazy或拆分配置来解决循环依赖。
-
无效JSON错误通常是由于前端使用了错误的引号,需使用英文双引号。
-
空指针异常需判空或使用安全调用操作符。
延伸解读
JSR-356容器的选择
在使用Spring WebSocket时,选择合适的JSR-356容器至关重要。默认的StandardWebSocketClient可能与嵌入式Tomcat不兼容,导致握手失败。开发者可以通过显式注入JSR-356容器或切换到Reactor Netty客户端来解决这一问题,确保WebSocket的正常连接。
循环依赖的处理
在Spring Boot 2.6及以上版本中,默认禁用循环依赖,这可能导致WebSocket配置未能正常注册。开发者应确保配置类中添加@EnableWebSocket注解,并使用@Lazy注解来解决循环依赖问题,以确保WebSocket的正常工作。
依赖版本的统一
Spring Boot 3.x使用jakarta.websocket,而2.x使用javax.websocket,版本不一致可能导致ClassNotFoundException等错误。开发者需确保项目中所有相关依赖版本统一,以避免类加载冲突,确保WebSocket功能正常。
延伸问答
JSR-356容器握手失败的常见现象是什么?
常见现象包括控制台没有afterConnectionEstablished日志,客户端卡在握手阶段或报错超时。
如何解决Spring MVC中JSR-356容器握手失败的问题?
可以显式注入JSR-356容器或切换到Reactor Netty客户端,并确保配置类添加@EnableWebSocket以避免循环依赖。
Spring Boot 3.x与WebSocket的依赖版本有什么关系?
Spring Boot 3.x使用jakarta.websocket,需统一依赖版本以防冲突。
无效JSON错误通常是由什么引起的?
无效JSON错误通常是由于前端使用了错误的引号,需使用英文双引号。
如何处理Spring WebSocket中的循环依赖问题?
可以通过@Lazy注解或拆分配置来解决循环依赖问题。
Spring WebSocket中常见的空指针异常如何避免?
空指针异常需判空或使用安全调用操作符。