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

Springboot使用Websocket的時候調(diào)取IOC管理的Bean報空指針異常問題

 更新時間:2025年05月15日 10:03:02   作者:墮落年代  
這篇文章主要介紹了Springboot使用Websocket的時候調(diào)取IOC管理的Bean報空指針異常問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

問題

這個問題主要是因為Websocket的工作方式導(dǎo)致的,下面是詳細解決方案

解決

WebSocket 端點類通常不受 Spring IOC 管理的原因在于它們是由 WebSocket 容器(例如,Tomcat、Jetty 等)而不是 Spring 容器管理的。

WebSocket 規(guī)范(JSR 356)定義了 WebSocket 端點的生命周期和管理方式,這通常與 Spring 的生命周期和依賴注入機制不同。

以下是一些具體原因和解決方法:

原因

不同的生命周期管理

  • WebSocket 端點的創(chuàng)建和管理是由 Web 容器(如 Tomcat、Jetty 等)負責(zé)的,而不是由 Spring 容器負責(zé)。
  • 這意味著 WebSocket 端點類的實例化和生命周期管理不在 Spring 的控制范圍內(nèi)。

注入機制不同

  • Spring 的依賴注入機制依賴于 Spring 容器管理的 Bean,但 WebSocket 端點類實例化時,Web 容器并不知道如何進行依賴注入。

解決方法

方法一:使用 Spring Boot 和 @Configuration 配置

在 Spring Boot 項目中,可以通過配置類和自定義 WebSocket 處理器來管理 WebSocket 連接,這樣可以使用 Spring 容器管理的 Bean。

創(chuàng)建 WebSocket 配置類

import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    private final MyWebSocketHandler myWebSocketHandler;

    public WebSocketConfig(MyWebSocketHandler myWebSocketHandler) {
        this.myWebSocketHandler = myWebSocketHandler;
    }

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(myWebSocketHandler, "/websocket").setAllowedOrigins("*");
    }
}

創(chuàng)建 WebSocket 處理器類

import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import org.springframework.stereotype.Component;

@Component
public class MyWebSocketHandler extends TextWebSocketHandler {

    private final SomeService someService;

    public MyWebSocketHandler(SomeService someService) {
        this.someService = someService;
    }

    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        String payload = message.getPayload();
        System.out.println("消息為:" + payload);
        someService.doSomething();  // 使用 Spring Bean
        session.sendMessage(new TextMessage("servet 發(fā)送:" + payload));
    }
}

方法二:使用自定義 SpringConfigurator

創(chuàng)建自定義的 SpringConfigurator

import javax.websocket.server.ServerEndpointConfig;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;

public class SpringConfigurator extends ServerEndpointConfig.Configurator {

    @Override
    public <T> T getEndpointInstance(Class<T> clazz) throws InstantiationException {
        WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext();
        if (context == null) {
            throw new InstantiationException("Unable to get Spring context.");
        }
        return context.getAutowireCapableBeanFactory().createBean(clazz);
    }
}

@ServerEndpoint 注解中指定 configurator

import javax.websocket.OnMessage;
import javax.websocket.server.ServerEndpoint;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@ServerEndpoint(value = "/websocket", configurator = SpringConfigurator.class)
@Component
public class MyWebSocket {

    @Autowired
    private SomeService someService;  // 由 Spring 管理的 Bean

    @OnMessage
    public String onMsg(String text) throws IOException {
        System.out.println("消息為:" + text);
        someService.doSomething();  // 使用 Spring Bean
        return "servet 發(fā)送:" + text;
    }
}

方法三:手動獲取 Spring Bean

創(chuàng)建 ApplicationContextProvider 類

import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class ApplicationContextProvider implements ApplicationContextAware {

    private static ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        context = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return context;
    }
}

在 WebSocket 類中使用 ApplicationContextProvider 獲取 Bean

import javax.websocket.OnMessage;
import javax.websocket.server.ServerEndpoint;
import org.springframework.stereotype.Component;

@ServerEndpoint(value = "/websocket")
@Component
public class MyWebSocket {

    private SomeService someService;

    public MyWebSocket() {
        this.someService = ApplicationContextProvider.getApplicationContext().getBean(SomeService.class);
    }

    @OnMessage
    public String onMsg(String text) throws IOException {
        System.out.println("消息為:" + text);
        someService.doSomething();  // 使用 Spring Bean
        return "servet 發(fā)送:" + text;
    }
}

通過這些方法,你可以確保 WebSocket 端點類能夠正確地訪問由 Spring IOC 管理的 Bean,從而避免空指針異常。

總結(jié)

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

相關(guān)文章

  • 詳解Spring?MVC優(yōu)雅處理異常的6種方式

    詳解Spring?MVC優(yōu)雅處理異常的6種方式

    在Spring中提供了多種機制來處理控制器拋出的異常,確保應(yīng)用程序在面對各種錯誤情況時能夠優(yōu)雅地響應(yīng),本文我們來詳細分析Spring?MVC中6種優(yōu)雅處理異常的方式,需要的可以參考下
    2024-12-12
  • SpringBoot個性化配置的方法步驟

    SpringBoot個性化配置的方法步驟

    這篇文章主要介紹了SpringBoot個性化配置的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • springboot用thymeleaf模板的paginate分頁完整代碼

    springboot用thymeleaf模板的paginate分頁完整代碼

    本文根據(jù)一個簡單的user表為例,展示 springboot集成mybatis,再到前端分頁完整代碼,需要的朋友可以參考下
    2017-07-07
  • Idea servlet映射方法優(yōu)缺點對比

    Idea servlet映射方法優(yōu)缺點對比

    這篇文章主要介紹了Idea servlet映射方法優(yōu)缺點對比,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • Java超詳細講解設(shè)計模式中的命令模式

    Java超詳細講解設(shè)計模式中的命令模式

    命令模式是將一個請求封裝為一個對象,從而可用不同的請求對客戶進行參數(shù)化,對請求排隊或者對請求做日志記錄,以及可以支持撤銷的操作
    2022-04-04
  • Java過濾器Filter詳解

    Java過濾器Filter詳解

    這篇文章主要介紹了java過濾器中Filter,發(fā)送請求時,如果有不符合的信息將會被filter進行攔截,如果符合則會進行放行。如果感興趣可以來學(xué)習(xí)一下
    2021-08-08
  • maven的卸載與安裝實現(xiàn)方式

    maven的卸載與安裝實現(xiàn)方式

    這篇文章主要介紹了maven的卸載與安裝實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2026-03-03
  • Java實例講解注解的應(yīng)用

    Java實例講解注解的應(yīng)用

    JAVA注解?Annotation(注解)是JDK1.5及以后版本引入的。它可以用于創(chuàng)建文檔,跟蹤代碼中的依賴性,甚至執(zhí)行基本編譯時檢查。注解是以‘@注解名’在代碼中存在的
    2022-06-06
  • springboot啟動后卡住無日志的幾種情況小結(jié)

    springboot啟動后卡住無日志的幾種情況小結(jié)

    這篇文章主要介紹了springboot啟動后卡住無日志的幾種情況小結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java TreeMap源碼解析詳解

    java TreeMap源碼解析詳解

    這篇文章主要介紹了java TreeMap源碼解析詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04

最新評論

和平县| 库车县| 南陵县| 简阳市| 锡林浩特市| 怀来县| 西乌珠穆沁旗| 宝兴县| 陵川县| 安泽县| 漳浦县| 招远市| 太康县| 仪陇县| 叙永县| 桃江县| 峡江县| 余干县| 龙游县| 墨江| 临潭县| 绥滨县| 屏南县| 秭归县| 祁连县| 贵港市| 开江县| 黄梅县| 金堂县| 巴彦淖尔市| 东光县| 墨脱县| 虹口区| 米脂县| 永德县| 资兴市| 武清区| 平顶山市| 定陶县| 包头市| 西林县|