解決SpringBoot整合WebSocket組件(@ServerEndPoint)無法@Autowired自動注入

1.前言

最近在項目中需要用到WebSocket,當我跟SpringBoot整合,然後做一些持久層的相關操作的時候,突然空指針異常,原因在於@Autowired或者@Resource無法自動注入,一開始以爲是我太久沒寫後端代碼,整合方式出了問題(QAQ),改了一堆配置還是沒解決,最後寫了個普通的Controller出來測試,發現完全OJBK。所以問題的源頭終於找到了,那就是WebSocket在搞鬼!

2.原因

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注入一次後,後面的對象就不會再注入了,會報null。

3.解決辦法

既然知道了原因,那就好解決了,只要把要注入的對象,申明爲static,以我的代碼爲例:

private static UserService userService;

@Autowired
public void setUserService(UserService userService){
    WebSocketService.userService=userService;
}

 

發佈了135 篇原創文章 · 獲贊 76 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章