spring使用WebSocket注入service層失敗問題及解決
使用WebSocket注入service層失敗
這里spring集成的是javax包下的WebSocket,出現(xiàn)了注入service層的異常,如果是使用spring-websocket則沒有這個問題。
spring集成javax包下的WebSocket需要配置ServerEndpointExporter實例。
<bean class="org.springframework.web.socket.server.standard.ServerEndpointExporter"/>
這樣注入service層失敗,調用userService是報空指針異常,注入失?。?/p>
@Autowired private IUserService userService;
原因
當有連接接入時,會創(chuàng)建一個新的服務器類對象,而spring只會給IOC容器啟動時創(chuàng)建的對象注入userService,連接接入時創(chuàng)建的對象并沒有注入
如下實驗:
@Component @ServerEndpoint(value = "/javaconver/{id}") public class Conversation { @Autowired private IUserService userService; //concurrent包的線程安全,用來存放每個客戶端對應的WebSocket private static ConcurrentHashMap<String, Conversation> sockets = new ConcurrentHashMap<>(); @OnOpen public void open(Session session, @PathParam("id")String id){ sockets.put(id,this); System.out.println(sockets); } }
這是寫了兩個頁面連接的結果:
可見確實是兩個不同的對象。
解決方法
將userService設為靜態(tài)變量,但是要注意:
@Autowired private static IUserService userService;
這樣寫仍然會報空指針異常,因為spring不會給靜態(tài)變量注入
正確寫法:
@Component @ServerEndpoint(value = "/javaconver/{id}") public class Conversation { private static IUserService userService; @Autowired public void setUserService(IUserService userService) { System.out.println("執(zhí)行seter方法"); this.userService = userService; System.out.println(this.userService); } //concurrent包的線程安全,用來存放每個客戶端對應的WebSocket private static ConcurrentHashMap<String, Conversation> sockets = new ConcurrentHashMap<>(); @OnOpen public void open(Session session, @PathParam("id")String id){ sockets.put(id,this); System.out.println(sockets); System.out.println(sockets.get(id).userService); System.out.println(Conversation.userService); } @OnMessage(maxMessageSize = 56666) public void message(String str, Session session){ userService.out(); } }
執(zhí)行結果:
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
淺談關于Java正則和轉義中\(zhòng)\和\\\\的理解
這篇文章主要介紹了淺談關于Java正則和轉義中\(zhòng)\和\\\\的理解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08Spring源碼之事件監(jiān)聽機制詳解(@EventListener實現(xiàn)方式)
這篇文章主要介紹了Spring源碼之事件監(jiān)聽機制(@EventListener實現(xiàn)方式),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08Java中byte、byte數(shù)組與int、long的轉換詳解
這篇文章分別給大家介紹了Java中byte和int之間的轉換、Java中 byte數(shù)組和int之間的轉換、Java中byte數(shù)組和long之間的轉換以及整理了整體工具類的源碼,需要的朋友可以參考借鑒,下面來一起看看吧。2017-02-02MyBatis多表關聯(lián)查詢的實現(xiàn)示例
本文主要介紹了MyBatis多表關聯(lián)查詢的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-03-03MyBatis處理CLOB/BLOB類型數(shù)據(jù)以及解決讀取問題
這篇文章主要介紹了MyBatis處理CLOB/BLOB類型數(shù)據(jù)以及解決讀取問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04