@Autowired を使用して null を挿入する Java WebSocket の問題

SpringBoot プロジェクトには WebSocket が組み込まれており、接続確立後に自動的に NullException がインジェクションされることがわかります。

Spring はシングルトンであり、WebSocket はマルチオブジェクトであるため (接続が確立されるたびにオブジェクトが生成されます)

したがって、プロジェクトが開始されると、WebSocket が初期化されて Spring コンテナーに注入されます。このとき注入されるサービスは null ではありませんが、Spring はシングルトンであるため、注入されるのは 1 回だけです。WebSocket 接続が再度確立されると、今回のオブジェクトは NullException です。

解決策: Spring コンテキストを通じて Bean を取得できます。

コンテキスト ツール クラスを取得します。

@Component 
public class SpringContextUtilimplements ApplicationContextAware { 


    /** 
     * 打印日志
     */ 
    private Logger logger = LoggerFactory.getLogger(getClass()); 

    /** 
     * 获取上下文对象
     */ 
    private static ApplicationContext applicationContext; 


    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 
        SpringContextUtil.applicationContext = applicationContext; 
        logger.info("set applicationContext"); 
    } 

    /** 
     * 获取 applicationContext 
     * 
     * @return 
     */
    public static ApplicationContext getApplicationContext() { 
        return applicationContext; 
    } 

    /** 
     * 通过 name 获取 bean 对象
     * 
     * @param name 
     * @return 
     */ 
    public static Object getBean(String name) { 

        return getApplicationContext().getBean(name); } 
    } 

    /** 
     * 通过 class 获取 bean 对象
     * 
     * @param clazz 
     * @param <T> 
     * @return 
     */ 
    public static <T> T getBean(Class<T> clazz) { 
        return getApplicationContext().getBean(clazz) ; 
    } 

    /**
     * 指定された Bean オブジェクトを名前で取得します、clazz
     * 
     * @param name 
     * @param clazz 
     * @param <T> 
     * @return 
     */ 
    public static <T> T getBean(String name, Class<T> clazz) { 
        return getApplicationContext().getBean(name, clazz); 
    } 
}

ビジネスコードで使用される場合:

@Component 
@ServerEndpoint(value = "/socket/{group}/{user}/{sessionId}") 
@Slf4j 
public class WebSocketServer { 

    private static AtomicInteger onlineCount = new AtomicInteger(0); 

    プライベート静的最終整数 MAX_CONNECT = 500; 

    プライベートMsgGroupEnumグループ。

    プライベート文字列ユーザー。

    プライベートセッションセッション。

    プライベート文字列セッションID; 

    public AppDataService getAppData() { 
        return SpringContextUtil.getBean(AppDataService.class); 
    }

}

おすすめ

転載: blog.csdn.net/weixin_43005845/article/details/119819231