O projeto SpringBoot integra o websocket e, após estabelecer a conexão, verifica-se que NullException é injetado automaticamente.
Porque spring é um singleton e websocket é um multiobjeto (um objeto é gerado toda vez que uma conexão é estabelecida)
Portanto, quando o projeto for iniciado, o websocket será inicializado e injetado no contêiner Spring. O serviço injetado neste momento não é nulo, mas Spring é um singleton, portanto, será injetado apenas uma vez. Quando a conexão do websocket for estabelecida novamente, desta vez o objeto é NullException.
Solução: você pode obter os beans por meio do contexto spring
Obtenha a classe da ferramenta de contexto:
@Component public class SpringContextUtil implements ApplicationContextAware { /** * 打印日志 */ private Logger logger = LoggerFactory.getLogger(getClass()); /** * 获取上下文对象 */ private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) lança BeansException { SpringContextUtil.applicationContext = applicationContext; logger.info("definir applicationContext"); } /** * Altera applicationContext * * @return */ public static ApplicationContext getApplicationContext() { return applicationContext; } /** * nome do nome do bean 对象 * * @param nome * @return */ public static Object getBean(String nome) { return getApplicationContext().getBean(nome); } /** * 通过 class 获取 bean 对象 * * @param clazz * @param <T> * @return */ public static <T> T getBean(Class<T> clazz) { return getApplicationContext().getBean(clazz) ; } /** * Obtenha o objeto bean especificado por nome, clazz * * @param nome * @param clazz * @param <T> * @return */ public static <T> T getBean(String nome, Class<T> clazz) { return getApplicationContext().getBean(nome, clazz); } }
Usado no código comercial:
@Component @ServerEndpoint(value = "/socket/{group}/{user}/{sessionId}") @Slf4j public class WebSocketServer { private static AtomicInteger onlineCount = new AtomicInteger(0); privado estático final int MAX_CONNECT = 500; grupo privado MsgGroupEnum; usuário String privado; sessão de sessão privada; string privada ID da sessão; public AppDataService getAppData() { return SpringContextUtil.getBean(AppDataService.class); }
}