SpringBoot中WebSokcet无法注入Bean对象的解决方案

一、业务场景

@Slf4j
@Component
@ServerEndpoint("/ws/{userId}")
public class WebSocketServer {@Autowiredprivate IChatService chatService;public static Map<Long, Session> sessionMap = new ConcurrentHashMap<>();@OnOpenpublic void onOpen(Session session, @PathParam("userId") Long userId) {log.info("用户: {} 与服务器建立连接", userId);sessionMap.put(userId, session);}@OnMessagepublic void onMessage(String message, Session senderSession, @PathParam("userId") Long senderUserId) {ChatMessage receivedMessage = JSON.parseObject(message, ChatMessage.class);sendAndPersistMessage(receivedMessage);}@OnClosepublic void onClose(Session session, @PathParam("userId") Long userId) {log.info("用户: {} 与服务器断开连接", userId);sessionMap.remove(userId);}private void sendAndPersistMessage(ChatMessage message) {log.info("用户: {} 向用户: {} 发送了如下消息: {}", message.getSenderId(), message.getReceiverId(), message.getContent());if (chatService != null) {Chat chat = Chat.builder().userId1(message.getSenderId()).userId2(message.getReceiverId()).content(message.getContent()).createTime(LocalDateTime.now()).build();chatService.save(chat);} else {log.info("消息持久化失败...");}String jsonMessage = JSON.toJSONString(message);Session receiverSession = sessionMap.get(message.getReceiverId());if (receiverSession != null) {try {receiverSession.getBasicRemote().sendText(jsonMessage);} catch (IOException e) {e.printStackTrace();}}}
}
22:47:05  INFO 14040 --- [io-8080-exec-10] com.lichun.websocket.WebSocketServer     : 用户: 1 与服务器建立连接
22:47:09  INFO 14040 --- [nio-8080-exec-1] com.lichun.websocket.WebSocketServer     : 用户: 2 与服务器建立连接
22:47:14  INFO 14040 --- [nio-8080-exec-2] com.lichun.websocket.WebSocketServer     : 用户: 1 向用户: 2 发送了如下消息: 你好
22:47:14  INFO 14040 --- [nio-8080-exec-2] com.lichun.websocket.WebSocketServer     : 消息持久化失败...

二、解决方案

(1)修改AccompanyApplication.java

ConfigurableApplicationContext applicationContext = SpringApplication.run(AccompanyApplication.class, args);WebSocketServer.setApplicationContext(applicationContext);
@EnableTransactionManagement
@SpringBootApplication
public class AccompanyApplication {public static void main(String[] args) {ConfigurableApplicationContext applicationContext = SpringApplication.run(AccompanyApplication.class, args);WebSocketServer.setApplicationContext(applicationContext);}}

(2)修改WebSocketServer.java

private static ApplicationContext applicationContext;public static void setApplicationContext(ApplicationContext applicationContext) {WebSocketServer.applicationContext = applicationContext;
}
IChatService chatService = (IChatService) applicationContext.getBean("chatServiceImpl");
Chat chat = Chat.builder().userId1(message.getSenderId()).userId2(message.getReceiverId()).content(message.getContent()).createTime(LocalDateTime.now()).build();
chatService.save(chat);
@Slf4j
@Component
@ServerEndpoint("/ws/{userId}")
public class WebSocketServer {public static Map<Long, Session> sessionMap = new ConcurrentHashMap<>();private static ApplicationContext applicationContext;public static void setApplicationContext(ApplicationContext applicationContext) {WebSocketServer.applicationContext = applicationContext;}@OnOpenpublic void onOpen(Session session, @PathParam("userId") Long userId) {log.info("用户: {} 与服务器建立连接", userId);sessionMap.put(userId, session);}@OnMessagepublic void onMessage(String message, Session senderSession, @PathParam("userId") Long senderUserId) {ChatMessage receivedMessage = JSON.parseObject(message, ChatMessage.class);sendAndPersistMessage(receivedMessage);}@OnClosepublic void onClose(Session session, @PathParam("userId") Long userId) {log.info("用户: {} 与服务器断开连接", userId);sessionMap.remove(userId);}private void sendAndPersistMessage(ChatMessage message) {log.info("用户: {} 向用户: {} 发送了如下消息: {}", message.getSenderId(), message.getReceiverId(), message.getContent());IChatService chatService = (IChatService) applicationContext.getBean("chatServiceImpl");Chat chat = Chat.builder().userId1(message.getSenderId()).userId2(message.getReceiverId()).content(message.getContent()).createTime(LocalDateTime.now()).build();chatService.save(chat);String jsonMessage = JSON.toJSONString(message);Session receiverSession = sessionMap.get(message.getReceiverId());if (receiverSession != null) {try {receiverSession.getBasicRemote().sendText(jsonMessage);} catch (IOException e) {e.printStackTrace();}}}public void noticeTimingTimeOut(Long userId1, Long userId2) {for (Long id : sessionMap.keySet()) {if (id.equals(userId1) || id.equals(userId2)) {Session session = sessionMap.get(id);if (session != null) {try {session.getBasicRemote().sendText("时间到...");} catch (IOException e) {e.printStackTrace();}}}}}
}

三、测试

23:00:43  INFO 12252 --- [nio-8080-exec-8] com.lichun.websocket.WebSocketServer     : 用户: 1 与服务器建立连接
23:00:47  INFO 12252 --- [nio-8080-exec-5] com.lichun.websocket.WebSocketServer     : 用户: 2 与服务器建立连接
23:00:56  INFO 12252 --- [nio-8080-exec-4] com.lichun.websocket.WebSocketServer     : 用户: 1 向用户: 2 发送了如下消息: 你好啊
23:00:56 ERROR 12252 --- [nio-8080-exec-4] c.a.druid.pool.DruidAbstractDataSource   : discard long time none received connection. , jdbcUrl : jdbc:mysql://127.0.0.1:13306/accompany?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true, jdbcUrl : jdbc:mysql://127.0.0.1:13306/accompany?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true, lastPacketReceivedIdleMillis : 296332
23:00:56 DEBUG 12252 --- [nio-8080-exec-4] com.lichun.mapper.ChatMapper.insert      : ==>  Preparing: INSERT INTO chat ( user_id1, user_id2, content, create_time ) VALUES ( ?, ?, ?, ? )
23:00:56 DEBUG 12252 --- [nio-8080-exec-4] com.lichun.mapper.ChatMapper.insert      : ==> Parameters: 1(Long), 2(Long), 你好啊(String), 2024-01-03T23:00:56.867703800(LocalDateTime)
23:00:56 DEBUG 12252 --- [nio-8080-exec-4] com.lichun.mapper.ChatMapper.insert      : <==    Updates: 1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/594264.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见网络协议

1.DNS协议 &#xff08;域名系统&#xff09; DNS协议使用的端口号是53 位于OSI模型中的应用层 DNS系统的作用&#xff1a;将域名&#xff08;网址&#xff09;解析为IP地址。 DNS的基本原理是&#xff1a;将域名映射到IP地址 DNS工作流程 当用户给定一个域名&#xff0…

物联网技术如何影响我们的生活

随着科技的不断进步&#xff0c;物联网技术已经深刻地融入了我们的日常生活。物联网&#xff0c;即物联网&#xff08;Internet of Things&#xff0c;IoT&#xff09;&#xff0c;指的是通过互联网连接各种物理设备和对象&#xff0c;使它们能够进行数据交换和实时通信。这项技…

【十三】【动态规划】1745. 分割回文串 IV、132. 分割回文串 II、516. 最长回文子序列,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

移动端APP版本治理

1、背景 在许多公司&#xff0c;APP版本都是不受重视的&#xff0c;产品忙着借鉴&#xff0c;开发埋头编码&#xff0c;测试想着不粘锅。 只有在用户反馈app不能用的时候&#xff0c;你回复客服说&#xff0c;让用户升级最新版本&#xff0c;是不是很真实。 而且业界也很少有…

一文讲清数据资产入表实操

《中共中央 国务院关于构建数据基础制度更好发挥数据要素作用的意见》已发布一年&#xff0c;数据资产化和入表已成为2023年的热门话题&#xff0c;随着2023年底国家数据局吹风《"数据要素x"三年行动计划&#xff08;2024-2026年&#xff09;》即将发布&#xff0c;这…

开发环境 目录记录

2023.12.27 jdk17 位置在 C:\DevelopTools\JavaDevelopTools\jdk17,配置了JAVA_HOME到环境变量&#xff0c;JAVA_HOME\bin到PATHapache-maven-3.6.1 位置在 C:\DevelopTools\JavaDevelopTools\apache-maven-3.6.1,配置了MAVEN_HOME到环境变量&#xff0c;MAVEN_HOME\bin到PA…

周赛378(中心扩散法、分组循环)

文章目录 周赛378[2980. 检查按位或是否存在尾随零](https://leetcode.cn/problems/check-if-bitwise-or-has-trailing-zeros/)转换题意 [2981. 找出出现至少三次的最长特殊子字符串 I](https://leetcode.cn/problems/find-longest-special-substring-that-occurs-thrice-i/)中…

[情商-7]:如何回答没有标准答案的两难问题

目录 前言&#xff1a; 一、用“逻辑推理思维”回答两难问题 二、用“情绪思维”回答两难问题 1.1 关注提问者提出问题背后的情绪状态和情绪/情感诉求 1.2 常见的常见的情绪和情感诉求 1.3 女性情感分析 1.4 理解女性情感的语言 1.5 如何通过语言理解女性的情绪需求 三…

模拟Spring事件监听机制

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 之前我们一起学习了Spr…

Maven下载和安装的详细教程

文章目录 一、Maven下载和安装1.1 下载 Maven1.2 配置环境变量 参考资料 一、Maven下载和安装 1.1 下载 Maven 打开 Maven 的官方网站Maven – Download Apache Maven&#xff0c;下载最新版本的 Maven 在可选择的版本中&#xff0c;不同版本的区别在于: binary是已经编译过的…

从零开始了解大数据(七):总结

系列文章目录 从零开始了解大数据(一)&#xff1a;数据分析入门篇-CSDN博客 从零开始了解大数据(二)&#xff1a;Hadoop篇-CSDN博客 从零开始了解大数据(三)&#xff1a;HDFS分布式文件系统篇-CSDN博客 从零开始了解大数据(四)&#xff1a;MapReduce篇-CSDN博客 从零开始了解大…

jdk9之后springboot项目访问外置jar包配置

启动命令增加 --add-opens java.base/jdk.internal.loaderALL-UNNAMED解释 --add-opens java.base/jdk.internal.loaderALL-UNNAMED 是 Java 9 引入的一个命令行选项&#xff0c;用于解决模块化系统&#xff08;Module System&#xff09;中的模块访问限制问题。 在 Java 9 中…

013、方法

1. 方法和函数的区别 方法与函数十分相似&#xff1a;它们都使用fn关键字及一个名称来进行声明&#xff1b;它们都可以拥有参数和返回值&#xff1b;另外&#xff0c;它们都包含了一段在调用时执行的代码。 但是&#xff0c;方法与函数依然是两个不同的概念&#xff0c;因为方法…

如何压缩图片?电脑图片压缩的方法

如果图片体积过大不仅会占用过多的内存&#xff0c;还容易在平时处理和上传的时候被限制&#xff0c;传输起来也比较慢&#xff0c;这个时候最简单的方法就是通过专业的图片处理工具压缩图片大小&#xff0c;现如今有许多在线处理工具可以选择&#xff0c;今天分享的压缩图就是…

模型融合之模型堆叠

一、理论 模型堆叠&#xff08;Model Stacking&#xff09;是一种集成学习的方法&#xff0c;其本质是将多个基学习器&#xff08;Individual Learner&#xff09;的预测结果作为新的特征&#xff0c;再训练一个元学习器&#xff08;Meta Learner&#xff09;来进行最终的预测。…

【JUC的四大同步辅助类】

文章目录 一、CountDownLatch二、CyclicBarrier三、Semaphore四、Phaser 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、CountDownLatch CountDownLatch如同火箭发射&#xff0c;计数只能不断减减&#xff0c;当到达0时即发射 场景示例&#xff1…

案例089:基于微信小程序的校园综合服务平台设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

ALSA学习(5)——ASoC架构中的Machine

参考博客&#xff1a;https://blog.csdn.net/DroidPhone/article/details/7231605 &#xff08;以下内容皆为原博客转载&#xff09; 文章目录 一、注册Platform Device二、注册Platform Driver三、初始化入口soc_probe() 一、注册Platform Device ASoC把声卡注册为Platform …

Typora+PicGo+Gitee构建云存储图片

创建Gitee仓库 首先&#xff0c;打开工作台 - Gitee.com&#xff0c;自行注册一个账户 注册完后&#xff0c;新建一个仓库&#xff08;记得仓库要开源&#xff09; 然后创建完仓库后&#xff0c;鼠标移动到右上角头像位置&#xff0c;选择设置&#xff0c;并点击&#xff…

终于学会听英文歌了:A Sad Me In Your Eyes

A Sad Me In Your Eyes 来源&#xff1a; https://lyricstranslate.com/en/ln-party-sad-me-your-eyes-lyrics.html Fire can’t burn in my eyes If without your smile Snow can cover your smile If without your love When you think of me, I’ve gone too far I can’t …