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
    评论
Spring Boot项目中集成WebSocket可以实现实通信,比如聊天应用或者推送通知。以下是使用Spring Boot和WebSocket的基本步骤: 1. **添加依赖**: 在你的`pom.xml`或`build.gradle`文件中添加Spring WebSocket相关的依赖。对于Maven,通常会使用`spring-boot-starter-websocket`。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` 2. **创建WebSocket配置**: 在`src/main/resources/META-INF/spring.factories`文件中,注册一个`org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer`实现类,如`WebSocketConfig`,配置WebSocket的消息发布机制。 3. **定义WebSocket处理器**: 创建一个处理WebSocket连接的`@Controller`,例如`ChatController`,并使用`@MessageMapping`和`@SendTo`注解处理客户端的消息。 ```java @Controller public class ChatController { @MessageMapping("/chat") @SendTo("/topic/messages") public ChatMessage sendMessage(ChatMessage message) { // 处理消息逻辑 return message; } } ``` 4. **处理WebSocket连接**: 配置WebSocket连接处理,如启动一个WebSocket服务器端点。 ```java @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); config.setApplicationDestinationPrefixes("/app"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/ws").withSockJS(); } } ``` 5. **客户端连接**: 客户端通常使用JavaScript的WebSocket API或者第三方库(如sockjs-client)来连接到WebSocket服务器。 6. **安全性考虑**: 如果需要,可以通过Spring Security配置WebSocket的安全,例如设置HTTPS,认证和授权。 相关问题:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值