Spring Boot WebSocket Handler中@Autowired注入为空问题排查求助
问题根因
你在
WebSocketConfig中手动通过new MessageWsHandler()创建Handler实例,该实例没有被Spring IoC容器托管,Spring不会对非容器管理的对象执行依赖注入,因此@Autowired标注的messageService无法被赋值,运行时为空。
解决方案
将手动new的Handler替换为Spring容器托管的实例即可,修改后的代码如下:
修改后的WebSocketConfig.java
@Configuration public class WebSocketConfig { @Autowired private Environment environment; // 注入Spring托管的MessageWsHandler实例 @Autowired private MessageWsHandler messageWsHandler; @Bean public WebSocketConnectionManager instrumentsWsConnectionManager() { // 传入注入的实例,而非手动new的实例 return getWebSocketConnectionManager(environment.getProperty("wsconfig.uri-prefix") + environment.getProperty("wsconfig.message-uri"), messageWsHandler); } private WebSocketConnectionManager getWebSocketConnectionManager(String webSocketUri, WebSocketHandler webSocketHandler) { WebSocketConnectionManager manager = new WebSocketConnectionManager( new StandardWebSocketClient(), webSocketHandler, webSocketUri); manager.setAutoStartup(true); return manager; } }
语法错误修正提示
原MessageWsHandler.java存在语法错误,类名和implements关键字之间缺少空格,修正后如下:
@Component public class MessageWsHandler implements WebSocketHandler { @Autowired MessageService messageService; // 其余业务代码 }
额外注意事项
如果修改后仍存在注入失败问题,请确认MessageWsHandler和MessageService所在的包在Spring Boot启动类的组件扫描路径范围内,默认扫描规则为启动类所在包及其所有子包。
内容的提问来源于stack exchange,提问作者Siddharth
相关产品推荐
相关产品推荐

