Websocket依赖注入@Autowired报空指针错误
代码如下
@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