1. 问题描述
SpringBoot+Vue
整合WebSocket
实现前后端消息推送:SpringCloud
集成WebSocket
实现前后端的消息推送
在上面集成websocket
的时候,如果需要在websocket
建立连接的回调方法中去调用其他业务的service
和mapper
的方法时,却注入失败,service
为空
2. 原因分析
项目启动时初始化,会初始化 websocket
(非用户连接的),spring
同时会为其注入 service
,该对象的 service
不是 null
,被成功注入。但是,由于 spring
默认管理的是单例,所以只会注入一次 service
。当新用户进入聊天时,系统又会创建一个新的 websocket
对象,这时矛盾出现了:spring
管理的都是单例,不会给第二个 websocket
对象注入 service
,所以导致只要是用户连接创建的 websocket
对象,都不能再注入了。
3. 解决方案
首先在websocket
的服务类中添加applicationContext
属性以及set方法
private static ApplicationContext applicationContext;
public static void setApplicationContext(ApplicationContext context){
applicationContext = context;
}
然后在项目的启动类中
public static void main(String[] args) {
ConfigurableApplicationContext application = SpringApplication.run(ServiceRestaurantApplication.class, args);
WebSocketServer.setApplicationContext(application);
}
然后就可以通过applicationContext
调用了
applicationContext.getBean(MessageService.class);