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

在WebSocket中使用Redis出现空指针异常解决方案

文章目录

  • 在WebSocket中使用Redis
    • 1.问题描述
    • 2.原因
    • 3.解决步骤
      • 1.新建一个SpringUtil.java类,通过getBean的方法主动获取实例
      • 2.在WebSocketSingleServer.java中导入

在WebSocket中使用Redis

1.问题描述

在controller 和 service中都可以正常使用Redis,在WebSocket中却报错?
在这里插入图片描述在这里插入图片描述

初次遇到这个问题,我还以为是字符串类型错误,改了两个小时才发现问题所在!!!

2.原因

在@ServerEndpoint注解类中使用@Resource或@Autowired注入失败。报出空指针异常。

原因是WebSocket是线程安全的,有用户连接时就会创建一个新的端点实例,一个端WebSocket是多对象的,使用的spring却是单例模式。这两者刚好冲突。

@Autowired注解注入对象是在启动的时候就把对象注入,而不是在使用A对象时才把A需要的B对象注入到A中。

而WebSocket在刚刚有说到,有连接时才实例化对象,而且有多个连接就有多个对象。总结就是,WebSocket是多对象的。不管单独使用也好,结合spring也好,或者结合SpringBoot也罢,他都是多对象的。

3.解决步骤

1.新建一个SpringUtil.java类,通过getBean的方法主动获取实例

package com.example.utils;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;@Component
public final class SpringUtils implements BeanFactoryPostProcessor {private static ConfigurableListableBeanFactory beanFactory;@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {SpringUtils.beanFactory = beanFactory;}public static ConfigurableListableBeanFactory getBeanFactory() {return beanFactory;}/*** 获取对象** @param name* @return Object 一个以所给名字注册的bean的实例* @throws org.springframework.beans.BeansException*/@SuppressWarnings("unchecked")public static <T> T getBean(String name) throws BeansException {if (getBeanFactory() == null) {//zhengkai.blog.csdn.netSystem.out.println("本地调试Main模式,没有BeanFactory,忽略错误");return null;} else {T result = (T) getBeanFactory().getBean(name);return result;}}/*** 获取类型为requiredType的对象** @param name* @return* @throws org.springframework.beans.BeansException*/public static <T> T getBean(Class<T> name) throws BeansException {if (getBeanFactory() == null) {//zhengkai.blog.csdn.netSystem.out.println("本地调试Main模式,没有BeanFactory,忽略错误");return null;} else {T result = (T) getBeanFactory().getBean(name);return result;}}/*** 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true** @param name* @return boolean*/public static boolean containsBean(String name) {return getBeanFactory().containsBean(name);}/*** 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)** @param name* @return boolean* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException*/public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {return getBeanFactory().isSingleton(name);}/*** @param name* @return Class 注册对象的类型* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException*/public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {return getBeanFactory().getType(name);}/*** 如果给定的bean名字在bean定义中有别名,则返回这些别名** @param name* @return* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException*/public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {return getBeanFactory().getAliases(name);}}

2.在WebSocketSingleServer.java中导入

    @Resourceprivate StringRedisTemplate stringRedisTemplate= SpringUtils.getBean(StringRedisTemplate.class);
http://www.lryc.cn/news/291598.html

相关文章:

  • 问题:第十三届全国人民代表大会第四次会议召开的时间是()。 #经验分享#知识分享#媒体
  • 《区块链简易速速上手小册》第10章:区块链的未来与趋势(2024 最新版)
  • JVM工作原理与实战(三十一):诊断内存泄漏的原因
  • #{}和${}的区别
  • 【数据结构】(三)树Tree
  • 扩展坞 接两个显示器
  • 鸿蒙 ArkTS 从数组内查找指定的数据
  • qemu 抓取linux kernel vmcore
  • RabbitMQ 死信队列应用
  • 除毛可以用宠物空气净化器吗?猫用空气净化器哪些品牌吸毛好?
  • 有趣的css - 好看的呼吸灯效果
  • 二叉树-堆应用(1)
  • 猫头虎博主第10期赠书活动:《写给大家看的Midjourney设计书》
  • 线程池相关的类学习
  • Redis核心技术与实战【学习笔记】 - 9.如何避免单线程模型的阻塞
  • 如何在 JavaScript 中使用 map() 迭代数组
  • 学习JavaEE的日子 Day19 常用类
  • 25考研政治备考计划
  • 漏洞01-目录遍历漏洞/敏感信息泄露/URL重定向
  • 软件工程知识梳理4-详细设计
  • Spring Boot3,启动时间缩短 10 倍!
  • Picturesocial | 只要 5 分钟,发现容器编排的秘密武器!
  • GEE数据集——Umbra 卫星合成孔径雷达开放数据
  • 一个vue项目中通过iframe嵌套另外一个vue项目,如何让这两个项目进行通信
  • 上班族学习方法系列文章目录
  • 《Lua程序设计》-- 学习9
  • GIS应用水平考试一级—2009 年度第二次
  • 【计算机视觉】万字长文详解:卷积神经网络
  • Vue3项目封装一个Element-plus Pagination分页
  • node.js(nest.js控制器)学习笔记