当前位置: 首页 > 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);

相关文章:

  • Linux——如何使用sftp命令轻松上传和下载文件
  • HTTPS实现原理
  • 软件工程知识梳理2-需求分析
  • 离线使用Element UI和Vue
  • Spring Cloud Gateway
  • linux☞ Centos 基础篇
  • 【C++】构造函数和析构函数详解
  • python查询xml类别
  • 在JAVA中如何使用ASCLL码
  • go语言文件操作
  • 回归预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机多变量回归预测
  • JVM 执行引擎
  • Linux实验记录:使用iptables
  • 《Docker极简教程》--前言--Docker的简介
  • 【每日一题】6.LeetCode——轮转数组
  • #Java异常处理
  • [case10]使用RSQL实现端到端的动态查询
  • 2019年如何成为全栈工程师?
  • Django 博客开发教程 8 - 博客文章详情页
  • js数组之filter
  • mysql中InnoDB引擎中页的概念
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 基于web的全景—— Pannellum小试
  • 世界上最简单的无等待算法(getAndIncrement)
  • 算法-图和图算法
  • 系统认识JavaScript正则表达式
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 阿里云服务器如何修改远程端口?
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #pragma pack(1)
  • #vue3 实现前端下载excel文件模板功能
  • (09)Hive——CTE 公共表达式
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (数据结构)顺序表的定义
  • (已解决)什么是vue导航守卫
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET命名规范和开发约定
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .NET委托:一个关于C#的睡前故事
  • .NET中GET与SET的用法
  • .NET中的Exception处理(C#)
  • // an array of int
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • @TableLogic注解说明,以及对增删改查的影响
  • @WebService和@WebMethod注解的用法
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [ SNOI 2013 ] Quare
  • []指针
  • [Android] Upload package to device fails #2720
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作