Websocket依赖注入@Autowired报空指针错误

发布时间 2023-11-17 15:42:46作者: jason47

代码如下

@ServerEndpoint("/ws/agent")
@Component
public class WebSocketServer {
    
    @Autowired
    private OnMessageAction onMsgAction;

        public void onMessage(String message, Session session) {
        
        onMsgAction.actionAgent(message);
    }
}

错误分析

@Component默认实例化的是单例模式,这就意味着在Spring容器加载时,就注入了OnMessageAction的实例,不管再调用多少次接口,加载的都是这个Bean同一个实例。

而@ServerEndpoint是多例模式,在项目启动时第一次初始化实例时,OnMessageAction的实例的确可以加载成功,但可惜这时WebSocket是无用户连接的。当有第一个用户连接时,WebSocket类会创建第二个实例,所以这时OnMessageAction对应的实例为空。后续每连接一个新的用户,都会再创建新的WebSocket实例,当然OnMessageAction的实例都为空。

解决方法

使用ApplicationContext.getBean获取OnMessageAction