当前位置: 首页 > ai >正文

关于使用WebSocket时无法使用@Autowired 注入的问题

目录

根本原因:WebSocket 类不是由 Spring 管理的 Bean 实例

解决方案:手动从 Spring 容器中获取 Bean

1. 创建 Spring 上下文工具类:

 2. 在 WebSocket 中使用:


虽然加上了 @Component,但 在 WebSocket 的生命周期回调方法中使用 @Autowired 注入其他 Bean 时会失败,这是因为:

根本原因:WebSocket 类不是由 Spring 管理的 Bean 实例

尽管你加了 @Component,Spring 确实会把这个类作为一个 Bean 注册到容器中。但是,Java 的 WebSocket API(JSR-356)在创建 @ServerEndpoint 对应的类实例时,并不是通过 Spring 容器来创建的,而是由底层的 WebSocket 容器(如 Tomcat、Jetty)直接 new 出来的。

也就是说:

  • Spring 创建了一个 WebSocketServer 实例(作为 Bean)
  • WebSocket 容器又自己 new 了一个 WebSocketServer 实例(用于处理连接)
  • 这个 new 出来的实例并没有被 Spring 管理,所以里面的 @Autowired 字段是 null
@Component
@ServerEndpoint("/webSocket/{userId}")
public class WebSocketServer {@Autowiredprivate SomeService someService; // 会是 null@OnOpenpublic void onOpen(...) {someService.doSomething(); // NullPointerException!}
}

解决方案:手动从 Spring 容器中获取 Bean

你可以通过一个工具类,从 Spring 容器中手动获取你需要的 Bean。

1. 创建 Spring 上下文工具类:

​
@Component
public class SpringContextUtils implements ApplicationContextAware {private static ApplicationContext context;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) {context = applicationContext;}public static <T> T getBean(Class<T> beanClass) {return context.getBean(beanClass);}public static <T> T getBean(String name, Class<T> beanClass) {return context.getBean(name, beanClass);}
}​

 2. 在 WebSocket 中使用:

@Component
@ServerEndpoint("/webSocket/{userId}")
public class WebSocketServer {@OnOpenpublic void onOpen(Session session, @PathParam("userId") String userId) {SomeService someService = SpringContextUtils.getBean(SomeService.class);someService.doSomething();}
}

http://www.xdnf.cn/news/13318.html

相关文章:

  • CompletableFuture浅谈
  • Efficient Attention 理解
  • 美团完整面经
  • Matlab解决无法读取路径中的空格
  • matlab分布式电源微电网潮流
  • uni-app 自定义路由封装模块详解(附源码逐行解读)
  • FEMFAT许可使用数据分析工具介绍
  • MySQL 主从复制与一主多从架构实战详解
  • Electron-vite【实战】MD 编辑器 -- 编辑区(含工具条、自定义右键快捷菜单、快捷键编辑、拖拽打开文件等)
  • 深入理解 TCP 套接字:Socket 编程入门教程
  • uniapp请求接口封装
  • C#引用传递代码记录
  • 第七章: SEO与渲染方式
  • 滚珠导轨在汽车自动化装配线中的核心传动
  • AVCap视频处理成帧和音频脚本
  • CKA考试知识点分享(9)---gateway api
  • 混合型交易所架构:CEX+DEX融合与Layer2扩展方案
  • Visual Stdio程序弹出的黑框内容如何复制
  • (天文学)恒星的介绍分类
  • 中兴B860AV1.1江苏移动-自动降级包
  • 手写RPC框架<四> 负载均衡
  • LSTM-XGBoost回归预测,多输入单输出(Matlab完整源码和数据)
  • 【AI时代速通QT】第一节:C++ Qt 简介与环境安装
  • 41页PPT | 基于AI制造企业解决方案架构设计智能制造AI人工智能应用智能质检人工智能质检建设
  • MyBatis实战指南(六)自动映射
  • 科技评论:Jim Keller 的“反向”战略:RISC-V 成为中国应对美国芯片封锁的关键武器
  • 为何AI推理正推动云计算从集中式向分布式转型
  • 一个教学项目pom.xml杂记
  • V837s-SDK Telnetd服务连接不上异常解决
  • 蓝奏云(Lanzou Cloud)一款国内知名的免费网盘和文件分享服务 以及蓝奏云的api