原因:
需求需要实时通知前端, 所以使用到了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