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

关于使用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();}
}

相关文章:

  • DNS小结
  • 探索奇妙的LLM应用:提高工作效率的AI代理和RAG合集
  • 高斯函数(Gaussian Function)
  • 别人如何访问我的内网呢? 设置让外网访问内网本地服务器和指定端口应用的几种方式
  • 认识RNN-循环神经网络
  • mysql中不等于走索引吗 不等于查询索引使用情况
  • C# 与低代码平台的融合:以活字格为例的 Web API 开发实践
  • Java项目:基于SSM框架实现的劳务外包管理系统【ssm+B/S架构+源码+数据库+毕业论文】
  • 新德通:光通信领域的硬核力量,引领高速互联新时代
  • 数据定义以及数据类型
  • 削皮刨结构化网格划分
  • ANeko v1.0.3 | 在手机里养只宠物猫 实时互动 动画细腻
  • 入选 ICML 2025,清华/人大提出统一生物分子动力学模拟器 UniSim
  • 网络安全中的封禁日志:从攻击拦截到安全运维的全景解析
  • 2025年深度学习+多目标优化最新创新思路
  • excel实现数据组合+删除换行:(SUBSTITUTE函数)
  • C语言——深入解析字符串函数与其模拟实现
  • CSP-J 2020 入门级 第一轮 阅读程序(1)
  • 线程运行的现象和相关指令
  • python训练营day50
  • 做一个旅游团网站怎么做/图片识别 在线百度识图
  • 网站关键词多长/衡阳seo排名
  • 安装网站提示dir/网站seo推广哪家值得信赖
  • 建设的比较好的档案馆网站/软件开发公司简介
  • 免费国外在线代理服务器/我赢网seo优化网站
  • 苏州网站设计公司价格/海外营销