最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot集成WebSocket遇到的問題及解決

 更新時間:2023年07月18日 14:42:27   作者:華陽余文樂  
這篇文章主要介紹了SpringBoot集成WebSocket遇到的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。

SpringBoot集成WebSocket遇到的問題

最近在項目中需要使用WebSocket,因為項目是使用的SpringBoot架構,所以集成比較簡單。

上代碼:

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

WebSocketServer.java

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
/**
 * web socket 工具類
 *
 * @author alvinqiu
 * @data 2018/10/24
 */
@Slf4j
@Component
@ServerEndpoint(value = "/ws/{type}")
public class WebSocketServer {
    /**
     * concurrent包的線程安全Set,用來存放每個客戶端對應的Session對象
     */
    private static CopyOnWriteArraySet<Session> SessionSet = new CopyOnWriteArraySet<Session>();
    @OnOpen
    public void onOpen(@PathParam("type") String type, Session session) {
        SessionSet.add(session);
        log.info("WebSocket有連接加入, 請求的數(shù)據(jù)類型為: " + type);
        try {
            sendMessage("Hello WebSocket " + type);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @OnClose
    public void onClose(Session session) {
        SessionSet.remove(session);
        log.info("WebSocket有連接關閉");
    }
    @OnError
    public void onError(Throwable error) {
        log.info("WebSocket發(fā)生錯誤, 原因: " + error.getMessage());
    }
    @OnMessage
    public void onMessage(String message) {
        log.info("收到來自WebSocket客戶端的消息: " + message);
    }
    /**
     * 發(fā)送消息給客戶端
     *
     * @param message
     * @throws IOException
     */
    public void sendMessage(String message) throws IOException {
        for (Session session : SessionSet) {
            if (session.isOpen()) {
                session.getBasicRemote().sendText(message);
            }
        }
    }
}

WebSocketConfig.java 

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/**
 * web socket 配置類
 *
 * @author alvinqiu
 * @data 2018/10/24
 */
@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

客戶端就不寫了,上面的代碼也沒什么好說的,相當簡單,項目跑起來就完事兒咯

結果就這簡單玩意兒出現(xiàn)了問題

項目運行

java.lang.IllegalStateException: Failed to register @ServerEndpoint class: class com.xxx.WebSocketServer$$EnhancerBySpringCGLIB$$62689f33

javax.websocket.DeploymentException: Cannot deploy POJO class [com.xxx.WebSocketServer$$EnhancerBySpringCGLIB$$62689f33] as it is not annotated with @ServerEndpoint

報錯了?怎么會呢,這么簡單的一個玩意兒,網(wǎng)上的教程不都是這么干的嗎

研究下錯誤,標注了@ServerEndPoint注解的類注冊失敗,百思不得其解,百度谷歌一番,什么jdk版本、tomcat版本、需不需要注入ServerEndpointExporter等等等等,我項目情況都不是(jdk1.8、tomcat8+、springboot內置容器)

后來想想是否因為項目是多模塊結構的原因,可能是jar包沖突、循環(huán)依賴,什么可能都想過,然后新建了一個springboot項目,只集成websocket試試,結果是正常運行的,版本一致,環(huán)境一致,代碼一致,問題看來出在項目本身了

項目結構

  • 父工程
  • A 模塊(啟動模塊,依賴了其他所有子模塊,一些公共的配置類)
  • B 模塊(業(yè)務模塊)
  • ...
  • ...
  • Q 模塊(WebSocket模塊)

難道是WebSocket作為一個單獨模塊出的飛機? 這么扯的理由我也不管了,還是把它挪到了A 模塊去,結果問題依舊....

前后折騰了很久,終于決定跟跟源碼

恩,就是這里annotation為null,至于為何為null還是不知道,突發(fā)奇想去看看另一個springboot項目(成功案例),

恩,annotation是有值的

發(fā)現(xiàn)了pojo的區(qū)別

(報錯)

class com.xxx.websocket.WebSocketServer$$EnhancerBySpringCGLIB$$62689f33

(成功)

class com.xxx.websocket.WebSocketServer

后面那一串是代表類被cglib轉換為了代理對象,什么情況下會被轉換為代理對象?

AOP!AOP!AOP!

簡直是如夢初醒,虎軀一震

我的 A 模塊里是寫了一個全局的log日志切面

大概是這樣:

/**
 * 日志切面
 *
 * @author alvinqiu
 * @date 2018/09/28
 */
@Slf4j
@Aspect
@Component
public class AspectLog {
    @Pointcut("execution(* com.xxx..*.*(..))")
    public void aspectLog() {
    }
    @Pointcut("execution(* com.xxx.api..*.*(..))")
    public void aspectApiLog() {
    }
    @Pointcut("execution(* com.xxx.service..*.*(..))")
    public void aspectServiceLog() {
    }
    @Pointcut("execution(* com.xxx.mapper..*.*(..))")
    public void aspectMapperLog() {
    }
    ...
    ...
}

問題找出來咯,WebSocketServer這個類被切咯,以至于@ServerEndPoint注解無法注入至對應的對象,導致報錯

解決

AOP 排除此類

總結

1. 出問題多看看源碼

2. 多與大神交流,碰撞,無論多么難以描述的問題,全世界都對,你的項目不對,也要與大神溝通,一點點的終究會得到思路

 以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java中l(wèi)ist.contains()的用法及拓展

    Java中l(wèi)ist.contains()的用法及拓展

    List集合相信大家在開發(fā)過程中幾乎都會用到,有時候難免會遇到集合里的數(shù)據(jù)是重復的,需要進行去除,下面這篇文章主要給大家介紹了關于Java中l(wèi)ist.contains()的用法及拓展的相關資料,需要的朋友可以參考下
    2023-03-03
  • SpringBoot利用可視化服務管理腳本部署應用

    SpringBoot利用可視化服務管理腳本部署應用

    在SpringBoot應用的生產環(huán)境部署中,傳統(tǒng)的手動啟停服務方式不僅效率低下,還容易出錯,所以本文將分享一個功能強大的可視化服務管理腳本,讓SpringBoot應用的部署和運維變得簡單高效
    2025-08-08
  • SpringBoot整合Kafka完成生產消費的方案

    SpringBoot整合Kafka完成生產消費的方案

    網(wǎng)上找了很多管理kafka整合springboot的教程,但是很多都沒辦法應用到生產環(huán)境,很多配置都是缺少,或者不正確的,只能當個demo,所以本文給大家介紹了SpringBoot整合Kafka完成生產消費的方案,需要的朋友可以參考下
    2024-12-12
  • 解決JavaWeb讀取本地json文件以及亂碼的問題

    解決JavaWeb讀取本地json文件以及亂碼的問題

    今天小編就為大家分享一篇解決JavaWeb讀取本地json文件以及亂碼的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Java多線程案例之阻塞隊列詳解

    Java多線程案例之阻塞隊列詳解

    阻塞隊列是一種特殊的隊列.?也遵守?“先進先出”?的原則.阻塞隊列能是一種線程安全的數(shù)據(jù)結構。本文將通過一些示例為大家詳細講講阻塞隊列的原理與使用,感興趣的小伙伴可以學習一下
    2022-10-10
  • 基于rabbitmq延遲插件實現(xiàn)分布式延遲任務

    基于rabbitmq延遲插件實現(xiàn)分布式延遲任務

    這篇文章主要介紹了基于rabbitmq延遲插件實現(xiàn)分布式延遲任務,今天我們講解延遲隊列的實現(xiàn)方式,而延遲隊列有很多種實現(xiàn)方式,今天就每種實現(xiàn)方式給大家大概介紹下,感興趣的朋友一起看看吧
    2022-01-01
  • Java模擬單鏈表和雙端鏈表數(shù)據(jù)結構的實例講解

    Java模擬單鏈表和雙端鏈表數(shù)據(jù)結構的實例講解

    這篇文章主要介紹了Java模擬單鏈表和雙端鏈表數(shù)據(jù)結構的實例,注意這里的雙端鏈表不是雙向鏈表,是在單鏈表的基礎上保存有對最后一個鏈接點的引用,需要的朋友可以參考下
    2016-04-04
  • Java實現(xiàn)按比抽獎功能

    Java實現(xiàn)按比抽獎功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)按比抽獎功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • springboot aspect通過@annotation進行攔截的實例代碼詳解

    springboot aspect通過@annotation進行攔截的實例代碼詳解

    這篇文章主要介紹了springboot aspect通過@annotation進行攔截的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Java單鏈表反轉圖文教程

    Java單鏈表反轉圖文教程

    這篇文章主要給大家介紹了關于Java單鏈表反轉的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04

最新評論

江川县| 永仁县| 瑞安市| 沙湾县| 兴和县| 汪清县| 金湖县| 东至县| 鄱阳县| 海伦市| 松滋市| 安溪县| 凌源市| 吉木乃县| 修文县| 安仁县| 辽源市| 葵青区| 饶平县| 克什克腾旗| 永昌县| 平阴县| 怀来县| 和平县| 柏乡县| 合山市| 灯塔市| 峨眉山市| 于都县| 皋兰县| 广汉市| 报价| 应城市| 读书| 政和县| 平塘县| 昌黎县| 鄱阳县| 双流县| 贡嘎县| 顺义区|