整合文章連接
此文是記錄我上網查找整合方案時候踩的坑,特別是注冊失敗的問題,比如還有什么去掉@Compoent就可以,但是這樣這個端點就失效了
特別是報錯:
at org.springframework.web.socket.server.standard.ServerEndpointExporter.registerEndpoint(ServerEndpointExporter.java:159) ~[spring-websocket-6.1.1.jar:6.1.1]at org.springframework.web.socket.server.standard.ServerEndpointExporter.registerEndpoints(ServerEndpointExporter.java:134) ~[spring-websocket-6.1.1.jar:6.1.1]
出現這個的有幾種情況
1.第一種是 onopen攜帶其他參數
缺少@PathParam annotation注解 如果再在端點的生命周期中,想要接收除了session,error等周期具備的基礎參數,那么就需要該注解否則注冊失敗
Caused by: jakarta.websocket.DeploymentException: A parameter of type [class java.lang.String] was found on method[onOpen] of class [java.lang.reflect.Method] that did not have a @PathParam annotation
解決辦法
周期方法的額外新參添加該注解,并且對應路由的傳參"@ServerEndpoint(value = “/chat/{userName}”,configurator = GetHttpSessionConfig.class)"
@PathParam(“userName”)
2.onError周期一定要攜帶error
@OnErrorpublic void onError(Throwable error) {System.out.println("onError......"+error.getMessage());}
3.接收對象為參數和發送對象 一定要使用解碼器,否則就采用接收json字符
@OnMessagepublic void onMessage(Session session,String message) throws IOException {System.out.println("接收到消息"+message);JSONObject json = JSON.parseObject(message);// 從JSONObject中提取必要的字段String sender = json.getString("sender");String content = json.getString("content");String toReceiver = json.getString("toReceiver");// 創建Message對象Message message1 = Message.builder().sender(sender)
// .toReceiver(toReceiver) //發給誰這個信息無需填寫.content(content).build();
//調用發送方的會話 發送給他的客戶端顯示Session session1 = Friendgroup.get(toReceiver);session1.getBasicRemote().sendText(JSON.toJSONString(message1));// 你的其他邏輯}
4.一定要注入該bean 作用是掃描注入的端點
@Beanpublic ServerEndpointExporter serverEndpointExporter(){return new ServerEndpointExporter();}
如果是打包運行在tomcat容器在則不用
5.由于端點是一個線程一個實列,在其中注入的spring bean會失效
比如aop 的自定義注解功能也會,異步功能設計到實列在這里也會失效
6.同樣是onOpen
@OnOpenpublic void onOpen(EndpointConfig sec,Session session,@PathParam("userName") String userName){this.userId=userName;//用戶上下文填充
//2.把成功建立升級的會話讓放入會話組String sessionKey=userName;Friendgroup.put(userName,session);
//之所以獲取http session 是為了獲取獲取httpsession中的數據 (用戶名 /賬號/信息)System.out.println("websocket建立成功");
// 2.廣播消息(如果是好咧別表上下) 模擬放房間提示String content="用戶id"+sessionKey+"已經上線 愉快玩耍吧";Message message = Message.builder().content(content).isSystem(true).build();broadcast(message);System.out.println("WebSocket 連接建立成功: " + sessionKey);
// 3.}
如果想要在端點處理用戶信息 參數可以傳遞EndpointConfig,千萬不要寫成ServerEndpointConfig,否則也會造成注冊失敗