首页 > 其他分享 >WebSocket无法注入属性

WebSocket无法注入属性

时间:2023-09-16 14:23:16浏览次数:40  
标签:WebSocket WebSocketServer class static context 属性 public webSocketService 注入

踩坑一:

原因:

是因为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;
}

踩坑二:

使用@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,WebSocketServer,class,static,context,属性,public,webSocketService,注入
From: https://www.cnblogs.com/Muieay/p/17706676.html

相关文章

  • 堆叠注入笔记
    1堆叠注入 1.1堆叠注入成因Sql查询语句中,分号“;”代表查询语句的结束,所以在执行sql语句结尾分号的后面,再加一条sql语句,这个语句会一起执行,造成注入,这就是堆叠注入(StackedInjection)。堆叠注入在mysql数据库中并不常见,常见于mssql数据库,mssql数据库是默认堆叠注入的。如用户输......
  • Springboot+WebSocket 实现IM及时通讯
    1、Springboot集成Websocket集成分为三步:添加依赖、增加配置类和消息核心类、前端集成。1.1、添加依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><version>2.1.13.RELEASE</version......
  • img的srcset属性的作用
    img标签的srcset可以用来处理页面在不同像素密度终端设备上对图片的选择性展示sizes作用就在于告诉浏览器根据【屏幕尺寸]和【像素密度】的计算值从srcset中选择最佳的图片源。<imgsrc="density-x1.jpg"srcset="density-x1.jpg1x>1.如果当前浏览器不认识srcs......
  • spring依赖注入单例模式下(默认都是单例),类变量(实例变量)线程安全问题
    java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。Java的变量类型有:   成员变量类中的变量(独立于方法之外的变量)   局部变量类的方法中的变量。而java类的成员变量又有俩种:   静态变量(类变量):独立于方法之外的变量,用static修饰。   实例变......
  • APC进程注入C++示例和检测思考
    直接贴C++代码效果:apc注入到pid为39712的进程procexp可以看到注入的DLL! 好了,我们看看代码如何写:注入部分//inject3.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。#include<iostream>#include<Windows.h>#include<TlHelp32.h>usingnamespacestd;......
  • vue3.3.x setup 新实验性特性 defineModel 定义多个属性
    由于有些业务组件需要定义多个响应式props,类似这种(比较懒,没上ts),在vue3.3.x以前,如果不用三方库,代码会变得很繁琐<scriptsetup> constprops=defineProps({ modelValue:{ type:Object, default:()=>({}) }, fields:{ type:Object, default:()=>(......
  • HarmonyOS应用开发Web组件基本属性应用和事件
    一、Web组件概述Web组件用于在应用程序中显示Web页面内容,为开发者提供页面加载、页面交互、页面调试等能力。● 页面加载:Web组件提供基础的前端页面加载的能力,包括加载网络页面、本地页面、Html格式文本数据。● 页面交互:Web组件提供丰富的页面交互的方式,包括:设置前端页面深色模......
  • Dynamics CRM - 使用 JS 对字段取值、赋值、实体属性设置等
    整理下平时CRM开发中用到的一些基本的js操作取值:varoResult=Xrm.Page.getAttribute(sFieldName).getValue();varoResult=Xrm.Page.getControl(sFieldName).getAttribute().getValue();赋值:一般类型:Xrm.Page.getAttribute(sFieldName).setValue(object);OptionSe......
  • 【Python&GIS】解决GIS属性表、矢量字段乱码,中文乱码
    ​    我们平时在使用代码处理矢量数据时,可能会出现矢量字段出现乱码的情况。同样有什么打开别人发的矢量文件有可能也会出现这种情况。那么我们该如何解决这个问题,让我们属性表中的中文字符正常显示呢?今天就和大家一起分享一下。1.原因        ArcGIS10.2之......
  • Vue——模版语法、文本指令、事件指令、属性指令、style和class、条件渲染、列表渲染
    模版语法<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><scriptsrc="./js/vue.js"></script></head><body><divid=&......