SpringBoot使用@ServerEndpoint无法@Autowired依赖注入问题解决
问题
websocket里面使用@Autowired注入service或bean时,报空指针异常。
1 | @Component |
原因
spring管理的都是单例(singleton)和 websocket (多对象)相冲突。
需要了解一个事实:websocket 是多对象的,每个用户的聊天客户端对应 java 后台的一个 websocket 对象,前后台一对一(多对多)实时连接,
所以 websocket 不可能像 servlet 一样做成单例的,让所有聊天用户连接到一个 websocket对象,这样无法保存所有用户的实时连接信息。
可能 spring 开发者考虑到这个问题,没有让 spring 创建管理 websocket ,而是由 java 原来的机制管理websocket ,所以用户聊天时创建的
websocket 连接对象不是 spring 创建的,spring 也不会为不是他创建的对象进行依赖注入,所以如果不用static关键字,每个 websocket 对象的 service 都是 null。
解决方案
- 方法一 使用static静态对象
1 | private static RedisTemplateUtil redisUtil; |
- 方法二 动态的从spring容器中取出RedisTemplateUtil 推荐方案
1 | package cn.pconline.framework.util; |