Websocket @ServerEndpoint不能注入@Autowired

文章讲述了在WebSocket的ServerEndpoint中使用@Autowired和@Value遇到的问题,由于Spring的单例模式与WebSocket多对象模型冲突。作者建议将Autowired的Service改为静态并从Nacos配置中读取,通过OnOpen方法注入配置值。

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

在连接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) {
    }
}
`@ServerEndpoint` 是Spring WebSockets框架中的一个注解,用于标识一个类作为WebSocket服务器端点,它不是普通的Spring Bean,因此不适合常规的依赖注入(Autowired)。Spring的@Autowired主要是为了自动装配bean之间的依赖,而WebSocket服务通常需要手动创建并注册。 当你在一个`@ServerEndpoint` 类上使用`@Autowired` 注解时,Spring容器并不会尝试去查找或注入依赖。如果你在这个类里需要外部组件,建议通过构造函数、setter方法或者配置类直接传递实例。 例如: ```java @Component public class WebSocketHandler { private final MyDependency myDependency; // 使用构造函数传入依赖 public WebSocketHandler(MyDependency myDependency) { this.myDependency = myDependency; } @ServerEndpoint("/endpoint") public void handleMessages(StompSession session) { // 在这里使用myDependency myDependency.doSomething(); } } // 或者在配置类中手动添加到服务器端点 @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); config.setApplicationDestinationPrefixes("/app"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/websocket").setHandshakeHandler(...); registry.addEndpoint("wsHandler").setHandler(new WsHandler(myDependency)); } private class WsHandler { private final MyDependency myDependency; public WsHandler(MyDependency myDependency) { this.myDependency = myDependency; } // ... } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值