WebSocket无法注入属性

这篇具有很好参考价值的文章主要介绍了WebSocket无法注入属性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

踩坑一:

原因:

是因为Spring对象的创建都是以单例模式创建的,在启动时只创建一次WebSocket。而WebSocketServer在每个连接请求到来时,都会new一个对象。所以当你启动项目时,你想要注入的对象已经注入进去,但是当用户连接是,新创建的websocket对象没有你要注入的对象,所以会报NullPointerException

解决:

通过static关键字让webSocketService属于WebSocketServer类

private static WebSocketService webSocketService; //通过static关键字让webSocketService属于WebSocketServer类

@Autowired//注入到WebSocketServer类的webSocketService属性里
public void setKefuService(WebSocketService webSocketService){
    WebSocketServer.webSocketService= webSocketService;
}

踩坑二:文章来源地址https://www.toymoban.com/news/detail-712271.html

使用@ServerEndpoint声明的websocket服务器中自动注入

  1. 错误方法,这样无法从容器中获取
@ServerEndpoint(value = "/chat/{username}")
@Service
public class WebSocketServer {

    @Resource // @Autowired
    private RabbitTemplate rabbitTemplate;  //null
}
  1. 解决:使用上下文获取
@ServerEndpoint(value = "/chat/{username}")
@Service
public class WebSocketServer {

    /*
     * 提供一个spring context上下文(解决方案)
     */
    private static ApplicationContext context;

    public static void setApplicationContext(ApplicationContext applicationContext) {
        WebSocketServer.context = applicationContext;
    }
}
  1. 在启动类中传入上下文
@SpringBootApplication
public class TalkApplication {
    public static void main(String[] args) {
        //解决springboot和websocket之间使用@autowired注入为空问题
        ConfigurableApplicationContext applicationContext =
                SpringApplication.run(TalkApplication.class, args);
        //这里将Spring Application注入到websocket类中定义的Application中。
        WebSocketServer.setApplicationContext(applicationContext);
    }
}
  1. 在使用的地方通过上下文去获取服务context.getBean();
public void sendSimpleQueue(String message) {
    String queueName = "talk";
    // 在使用的地方通过上下文去获取服务context.getBean();
    RabbitTemplate rabbitTemplate = context.getBean(RabbitTemplate.class);
    
    rabbitTemplate.convertAndSend(queueName, message);
}

到了这里,关于WebSocket无法注入属性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JavaScript 踩坑 WebSocket

    目的: 想编写一个websocket自动重连功能 方法: 当连接断开时,利用 .onclose 创建定时任务,定时尝试创建websocket连接。 异常现象: 定时任务间隔在2秒以内,当网络通畅后,最后有多个websocket同时建立。 原因: 定时任务创建websocket是异步执行,但没有在任务内判断上一个

    2023年04月14日
    浏览(37)
  • macOS-安装应用-无法打开,因为Apple无法检查其是否包含恶意软件

    在 mac 系统中安装应用,尤其是从网上下载的应用,是很常见的事。但经常会遇到各种各样的原因无法安装,下面这个提示就是最常见的: 这是因为这些软件没有上线 App Store ,基于安全策略GateKeeper, mac 拒绝了安装。 这里提供几种方案: 打开“ 系统偏好设置 ”-“ 安全性

    2024年02月05日
    浏览(162)
  • 无法启动此程序,因为dll丢失的解决方法

    动态链接库(英语:Dynamic-link library,缩写为DLL)是微软公司在微软视窗操作系统中实现共享函数库概念的一种实现方式。这些库函数的扩展名是.DLL、.OCX(包含ActiveX控制的库)或者.DRV(旧式的系统驱动程序)。 1.去软件可以正常使用的电脑的C:WindowsSystem32下复制相应的dl

    2024年02月04日
    浏览(81)
  • Flutter 运行IOS真机,提示无法打开“iproxy”,因为无法验证开发者

    Flutter 运行IOS真机,提示无法打开“iproxy”。如下图: 在终端输入一下命令行 + flutter SDK路径(/Users/xxx/flutter/bin/cache/artifacts/usbmuxd/iproxy)  如:

    2024年02月08日
    浏览(62)
  • 【运维】macOS-安装应用-无法打开,因为Apple无法检查其是否包含恶意软件

    在 mac 系统中安装应用,尤其是从网上下载的应用,是很常见的事。但经常会遇到各种各样的原因无法安装,下面这个提示就是最常见的: 这是因为这些软件没有上线 App Store ,基于安全策略GateKeeper, mac 拒绝了安装。 这里提供几种方案: 打开“ 系统偏好设置 ”-“ 安全性

    2024年02月04日
    浏览(54)
  • 踩坑笔记 Spring websocket并发发送消息异常

    今天刚刚经历了一个坑,非常新鲜,我立刻决定记录下来。首先,让我们先看一下我们项目中使用的 Spring WebSocket 示例代码。 在我们的项目中,我们使用了 Spring WebSocket 来实现服务器与客户端之间的实时通信。下面是一个简化的示例代码: WebSocketConfig配置代码 握手拦截器代

    2024年02月09日
    浏览(45)
  • 无法启动此程序,因为dll丢失的解决方法分享

    大家在使用电脑的时候,应该经常会遇到这种情况吧?在你打开某些程序的时候,突然弹出一个框框说无法启动此程序,因为dll丢失,那么遇到这种情况,我们需要怎么去解决呢?今天小编就详细的给大家讲解一下方法。 无法启动此程序,因为dll丢失 方法一: 一般遇到这种

    2024年02月05日
    浏览(87)
  • 无法加载文件,因为在此系统上禁止运行脚本。

    1.vscode报错,nodemon :因为在此系统上禁止运行脚本。 注意:不仅仅适用于nodemon报错,报在此系统上禁止运行脚本的错都可以用以下方法解决 2.报错原因分析:windows 为了安全,默认的执行策略为 Restricted,因此需要将执行策略设置为 RemoteSigned 即可 3.解决方法 步骤: 1.报错 2.找到Window

    2023年04月08日
    浏览(43)
  • MAC移动硬盘无法正常推出:“磁盘无法推出,因为一个或多个程序正在使用它”

        MAC移动硬盘在使用中,经常会碰到无法正常退出的情况,提示:“ 磁盘无法推出,因为一个或多个程序正在使用它 ”,如果你“ 直接拔掉 ”或“ 强行推出 ”的话,可能导致你下次重新连接移动硬盘无法识别。(参考:MAC移动硬盘无法识别解决方案) 步骤一:     如

    2024年02月06日
    浏览(256)
  • Python|(解决)苹果mac电脑无法打开“chromedriver”,因为无法验证开发者,要怎么解决?

    前言 我们工作上,很多朋友都是使用的Windows系统电脑,但还是有部分朋友使用的是苹果mac电脑,Windows系统电脑这里不细说,今天好好说下使用苹果mac电脑遇到关于使用selenium的问题。废话不多说,跟着小编直接进入正题。 解决 苹果mac电脑无法打开‘chromedriver’,因为无法验

    2024年02月04日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包