Problema con java websocket usando @Autowired para inyectar nulo

El proyecto SpringBoot integra websocket y, después de establecer la conexión, descubre que NullException se inyecta automáticamente.

Porque Spring es un singleton y websocket es un objeto múltiple (se genera un objeto cada vez que se establece una conexión)

Entonces, cuando comienza el proyecto, el websocket se inicializará y se inyectará en el contenedor Spring. El servicio inyectado en este momento no es nulo, pero Spring es un singleton, por lo que solo se inyectará una vez. Cuando se establezca nuevamente la conexión Websocket, esta vez El objeto es NullException.

Solución: puedes obtener los frijoles a través del contexto de primavera.

Obtenga la clase de herramienta de contexto:

@Component 
public class SpringContextUtil implements ApplicationContextAware { 


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

    /** 
     * 获取上下文对象
     */ 
    privado estático ApplicationContext applicationContext; 


    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) lanza BeansException { 
        SpringContextUtil.applicationContext = applicationContext; 
        logger.info("establecer contexto de aplicación"); 
    } 

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

    /** 
     * nombre del nombre bean nombre 
     * 
     * @param nombre 
     * @return 
     */ 
    public static Object getBean(String name) { 

        return getApplicationContext().getBean(name); 
    } 

    /** 
     * clase de bean de clase 
     * 
     * @param clazz 
     * @param <T> 
     * @return 
     */ 
    public static <T> T getBean(Class<T> clazz) { 
        return getApplicationContext().getBean(clazz) ; 
    } 

    /** 
     * Obtiene el objeto bean especificado mediante nombre, clazz
     * 
     * @param nombre 
     * @param clazz 
     * @param <T> 
     * @return 
     */ 
    public static <T> T getBean(String name, Class<T> clazz) { 
        return getApplicationContext().getBean(nombre, clazz); 
    } 
}

Utilizado en código comercial:

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

    privado estático AtomicInteger onlineCount = new AtomicInteger(0); 

    int final estático privado MAX_CONNECT = 500; 

    grupo privado MsgGroupEnum; 

    usuario de cadena privada; 

    sesión de sesión privada; 

    ID de sesión de cadena privada; 

    público AppDataService getAppData() { 
        return SpringContextUtil.getBean(AppDataService.class); 
    }

}

Supongo que te gusta

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