Problema com websocket java usando @Autowired para injetar nulo

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

}

Acho que você gosta

Origin blog.csdn.net/weixin_43005845/article/details/119819231
Recomendado
Clasificación