一、场景
需要使用@ServerEndpoint来建立websocket链接。引入依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
配置Websocket
@Configuration
@EnableWebSocket
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
启动报错
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'serverEndpointExporter' defined in class path resource [com/southsmart/server/algorithm/config/WebSocketConfig.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: javax.websocket.server.ServerContainer not available
二、排查思路
- 报的错误是创建ServerEndpointExporterBean失败,原因是ServerContainer不可用,那么我们就去看到ServerContainer在ServerEndpointExporter中是怎么注入的。
看到注入位置是ServerEndpointExporter第92行
@Override
protected void initServletContext(ServletContext servletContext) {
if (this.serverContainer == null) {
this.serverContainer =
(ServerContainer) servletContext.getAttribute("javax.websocket.server.ServerContainer");
}
}
debug发现
(ServerContainer) servletContext.getAttribute(“javax.websocket.server.ServerContainer”);
返回null文章来源:https://www.toymoban.com/news/detail-628134.html
- 为什么servletContext会返回null,定位到 ServerContainer 类,发现他是一个接口,那必定注入的时候是有相应的实现类,点击查看实现,居然有三个实现类,那就可以推断是依赖冲突导致不知道要注入哪个实现,最后获取Bean的时候返回了null。
一、场景
需要使用@ServerEndpoint来建立websocket链接。引入依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
配置Websocket
@Configuration
@EnableWebSocket
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
启动报错
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'serverEndpointExporter' defined in class path resource [com/southsmart/server/algorithm/config/WebSocketConfig.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: javax.websocket.server.ServerContainer not available
二、排查思路
- 报的错误是创建ServerEndpointExporterBean失败,原因是ServerContainer不可用,那么我们就去看到ServerContainer在ServerEndpointExporter中是怎么注入的。
看到注入位置是ServerEndpointExporter第92行
@Override
protected void initServletContext(ServletContext servletContext) {
if (this.serverContainer == null) {
this.serverContainer =
(ServerContainer) servletContext.getAttribute("javax.websocket.server.ServerContainer");
}
}
debug发现
(ServerContainer) servletContext.getAttribute(“javax.websocket.server.ServerContainer”);
返回null
- 为什么servletContext会返回null,定位到 ServerContainer 类,发现他是一个接口,那必定注入的时候是有相应的实现类,点击查看实现,居然有三个实现类,那就可以推断是依赖冲突导致不知道要注入哪个实现,最后获取Bean的时候返回了null。
文章来源地址https://www.toymoban.com/news/detail-628134.html
- 利用Maven Helper插件通过jar包找到相应的依赖,并排除,只留下一个即可,我这里选择留下的是WsServerContainer。
- 重新启动,发现问题已经解决。
到了这里,关于SpringBoot引入WebSocket依赖报ServerContainer no avaliable的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!