SpringBoot + WebSocket的service注入失败为null问题
最近用websocket做项目的时候,遇到需要service注入的时候报错null,并且连接关闭,查询之后最简单的就是以下方法:
解决方法: 定义静态Service , 给类的Service注入
@Component
public class PlanmecaWebSocketServer {
// @Autowired
// private PlanmecaScreenService planmecaScreenService;
//用以下代码替换注释掉的代码,问题解决
private static PlanmecaScreenService planmecaScreenService;
@Autowired
public void setPlanmecaScreenService(PlanmecaScreenService planmecaScreenService){
PlanmecaWebSocketServer.planmecaScreenService = planmecaScreenService;
}
}
主要原因:spring管理的都是单例(singleton),和 websocket (多对象)相冲突。项目启动时初始化,会初始化 websocket (非用户连接的),spring 同时会为其注入 service,该对象的 service 不是 null,被成功注入。但是,由于 spring 默认管理的是单例,所以只会注入一次 service。当客户端与服务器端进行连接时,服务器端又会创建一个新的 websocket 对象,但是 spring 管理的都是单例,不会给第二个 websocket 对象注入 service,所以导致只要是用户连接创建的 websocket 对象,都不能再注入了。
像 controller 里面有 service, service 里面有 dao。因为 controller,service ,dao 都有是单例,所以注入时不会报 null。但是 websocket 不是单例,所以使用spring注入一次后,后面的对象就不会再注入了,会报NullException。
原文链接:https://blog.csdn.net/qq_40731745/article/details/114702020