• Websocket @ServerEndpoint不能注入@Autowired


    websocket中使用@ServerEndpoint无法注入@Autowired、@Value

    问题分析

    Spring管理采用单例模式(singleton),而 WebSocket 是多对象的,即每个客户端对应后台的一个 WebSocket 对象,也可以理解成 new 了一个 WebSocket,这样当然是不能获得自动注入的对象了,因为这两者刚好冲突。

    @Autowired 注解注入对象操作是在启动时执行的,而不是在使用时,而 WebSocket 是只有连接使用时才实例化对象,且有多个连接就有多个对象。

    所以我们可以得出结论,这个 Service 根本就没有注入到 WebSocket 当中。

    使用static静态变量

    读取nacos的配置,通过Environment来获取,必须使用static,将需要注入的 Service 改为静态,让它属于当前类,然后通过 set方法进行注入即可解决。
    环境变量注入

    private static Environment environment;
    @Autowired
    private void setEnvironment(Environment environment){
        WebSocketServer.environment = environment;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在连接websocket的时候获取nacos的字段值

    @OnOpen
    public void onOpen(Session session, @PathParam(value = "userId") String userId) {
        try {
            
            token = environment.getProperty("platform.login.token");
            String stationIDStr = environment.getProperty("platform.station.id");
            if (StrUtil.isEmptyIfStr(stationIDStr)){
                stationId = 1;
            }else {
                stationId = Integer.valueOf(stationIDStr);
            }
            
            
            this.session = session;
            this.userId = userId;
            webSockets.add(this);
            sessionPool.put(userId, session);
            log.info("[websocket消息]有新的连接,总数为:" + webSockets.size());
        } catch (Exception e) {
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    maven的settings.xml和pom.xml配置文件详解
    10.30刷题笔记
    MySQL主从复制的三种复制模式
    Redis 数据结构
    unity 头发的渲染
    Elasticsearch RestHighLevelClient API 使用总结
    SphereEx苗立尧:云原生架构下的Database Mesh研发实践
    学生党用什么蓝牙耳机好?学生党性价比高的蓝牙耳机推荐
    Matplotlib 主要参数配置
    【Docker与微服务】高级篇
  • 原文地址:https://blog.csdn.net/zyfmeng/article/details/134199440