直接上解決方案:
在你的WebSocketServer服務器中
public static MessageService messageService; //要注入的類// 注入的時候,給類的 service 注入@Autowiredpublic void setChatService(MessageService messageService) {WebSocketServer.messageService = messageService;}
報錯原因:
本質原因:spring管理的都是單例(singleton)和 websocket (多對象)相沖突。
這個問題的本質是由于 Spring 管理的對象通常是單例(singleton),而 WebSocket 對象是多例的,因為每個用戶的聊天客戶端對應后臺的一個 WebSocket 對象。這導致了單例和多例的沖突。Servlet 可以設計成單例,因為它是基于請求-響應模型,但 WebSocket 不適合這種設計,因為它需要保持與每個客戶端的長連接。
綜上所述,問題的核心在于如何解決 Spring 管理的單例對象與 WebSocket 多例對象之間的沖突。需要尋找一種方法來正確管理 WebSocket 對象,以便每個用戶都能擁有自己的實時連接,并且在整個應用程序生命周期內保持正確的狀態。可能的解決方案包括創建一個 WebSocket 管理器來動態管理 WebSocket 對象,或者使用 Spring 提供的作用域來限定 WebSocket 對象的范圍。