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); }
}