Springboot+Websocket中@Autowired注入service为null的解决方法
在Websocket中使用@Autowired注入service时注入失败,service为null。

问题原因
Spring默认对bean的管理都是单例(singleton),和 websocket (多对象)相冲突。
项目启动时初始化,会初始化 websocket (非用户连接的),spring 同时会为其注入 service,该对象的 service 不是 null,被成功注入。但是,由于 spring 默认管理的是单例,所以只会注入一次 service。当用户建立新的连接时,系统又会创建一个新的 websocket 对象,这时不会再次注入了,所以导致只要是用户连接创建的 websocket 对象,都不能再注入了,后面的注入均为null。
解决方法
方法1:使用静态变量 加 @PostConstruct 解决
@ServerEndpoint("/websocket/{userId}")
@Component //关键点1
public class WebSocket {
@Autowired
private UserService userService;
private static WebSocket webSocket; //关键点2
@PostConstruct //关键点3
public void init(){
webSocket = this;
}
//略去其他代码...
@OnMessage
public void onMessage(String message, Session session) {
if(!StringUtils.isEmpty(message)){
try {
log.info("收到用户【{}】的消息: {}",this.userId,message);
webSocket.userService.helloService(); //关键点4
session.getBasicRemote().sendText("收到 "+this.userId+" 的消息 "

本文探讨了在Springboot中使用@Autowired注解在Websocket组件中注入Service时遇到的null问题,原因在于单例模式与多对象websocket的冲突。提供了三种解决方案:静态变量配合@PostConstruct,静态变量设置注入,以及SpringContextHolder获取实例。通过这些方法,确保新建立的websocket连接能成功注入Service。

1620

被折叠的 条评论
为什么被折叠?



