SpringBoot项目使用WebSocket时,使用依赖注入抛出空指针异常

原因:

需求需要实时通知前端, 所以使用到了WebScoket建立连接,做到实时效果.在WebSocket根据类中使用依赖注入,抛出空指针异常,
因为spring默认是单例模式,只会初始化一次WebSocket对象并注入属性一次,但是项目需要建立多个连接,在创建 第二个WebSocket对象时就不会注入, 所以抛出空指针异常

解决方法:

两种解决方式:

一:

给属性加上static 关键字, 让这个属性属于类,添加到方法区,变成共享变量
在这里插入图片描述

二:

在新建立连接的时候重新从Spring 容器中获取 BarrageMessageService 对象

@Component
  public class WebSocketHandlerMessage implements WebSocketHandler {
  
      /**
       * 获取 barrageMessageService 对象方法
       *
       * @return
       */
      public BarrageMessageService getMessageService() {
         return SpringContext.getBean(BarrageMessageService.class);
     }
 
     /**
      * 获取 stringRedisTemplate 对象方法
      *
      * @return
      */
     public StringRedisTemplate getStringRedisTemplate() {
         return SpringContext.getBean(StringRedisTemplate.class);
     }

SpringContext 工具类方法:

 /**
   * @Description: SpringContext  获取 Spring 上下文信息
   * @Author: mingtian
   * @CreateDate: 2020/6/8 14:59
   * @Version: 1.0
   */
  @Component
  public class SpringContext implements ApplicationContextAware {
 
     /**
      * 打印日志
      */
     private Logger logger = LoggerFactory.getLogger(getClass());
 
     /**
      * 获取上下文对象
      */
     private static ApplicationContext applicationContext;
 
 
     @Override
     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
         SpringContext.applicationContext = applicationContext;
        logger.info("set applicationContext");
     }
 
     /**
      * 获取 applicationContext
      *
      * @return
     */
     public static ApplicationContext getApplicationContext() {
         return applicationContext;
     }
 
     /**
      * 通过 name 获取 bean 对象
      *
      * @param name
      * @return
      */
     public static Object getBean(String name) {
 
         return getApplicationContext().getBean(name);
     }
 
     /**
      * 通过 class 获取 bean 对象
      *
      * @param clazz
      * @param <T>
      * @return
      */
     public static <T> T getBean(Class<T> clazz) {
         return getApplicationContext().getBean(clazz);
     }
 
     /**
      * 通过 name,clazz  获取指定的 bean 对象
      *
      * @param name
      * @param clazz
      * @param <T>
      * @return
      */
     public static <T> T getBean(String name, Class<T> clazz) {
         return getApplicationContext().getBean(name, clazz);
     }
 
 }

参考链接:https://www.cnblogs.com/ming-blogs/p/13935166.html

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值