解决webSocker中使用@Value获取配置文件中值为null
- 1.(常规写法)在webSocker中使用 @Value 取值为null
- 2.原因分析
- 3.解决问题
1.(常规写法)在webSocker中使用 @Value 取值为null
@Component
@ServerEndpoint(value = "/webSocket")
@Slf4j
public class WebSocketServer {@Value("${url}")private String url;
}
2.原因分析
@ServerEndpoint
表示这是一个websocket
服务端类,根本原因在于:spring
管理的都是单例(singleton)和websocket
(多对象)相冲突。websocket
多用于客户端与服务端快速通信:聊天、实时输出日志等场景,这意味着每一个客户端请求服务端都会生成一个新的websocket
实例,spring 仅仅针对@component
、@controller
注解完成单例模式管理任务(注意仅仅这一次、这一个对象赋值了)后续随着客户单端访问websocket
不断进行实例化(这些对象不是由spring管理的,所以启动过程并无法给后续的实际处理websocket
会话的实例赋值)。不改变方法的话每个websocket
对象的 注入对象值得都是 null。
3.解决问题
将要注入的对象设为类级别的变量,并通过在方法上使用@Autowired
、@Value
对变量进行初始化,进而使变量不为空:
@Component
@ServerEndpoint(value = "/webSocket")
@Slf4j
public class WebSocketServer {//@Value("${url}") ! 注解掉//static为关键private static String url;@Value("${url}")public void setScadaUrl(String scadaUrl) {this.url= url;}
}