Spring WebSocket 错误

💡 原文中文,约3800字,阅读约需9分钟。
📝

内容提要

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中常见的空指针异常如何避免?

空指针异常需判空或使用安全调用操作符。

🏷️

标签

➡️

继续阅读