SpringBoot引入WebSocket依赖报ServerContainer no avaliable

一、场景

需要使用@ServerEndpoint来建立websocket链接。引入依赖。

<dependency>  
    <groupId>org.springframework.bootgroupId>  
    <artifactId>spring-boot-starter-websocketartifactId>  
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

二、排查思路

  1. 报的错误是创建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

  1. 为什么servletContext会返回null,定位到 ServerContainer 类,发现他是一个接口,那必定注入的时候是有相应的实现类,点击查看实现,居然有三个实现类,那就可以推断是依赖冲突导致不知道要注入哪个实现,最后获取Bean的时候返回了null。

一、场景

需要使用@ServerEndpoint来建立websocket链接。引入依赖。

<dependency>  
    <groupId>org.springframework.bootgroupId>  
    <artifactId>spring-boot-starter-websocketartifactId>  
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

二、排查思路

  1. 报的错误是创建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

  1. 为什么servletContext会返回null,定位到 ServerContainer 类,发现他是一个接口,那必定注入的时候是有相应的实现类,点击查看实现,居然有三个实现类,那就可以推断是依赖冲突导致不知道要注入哪个实现,最后获取Bean的时候返回了null。

在这里插入图片描述

  1. 利用Maven Helper插件通过jar包找到相应的依赖,并排除,只留下一个即可,我这里选择留下的是WsServerContainer。
    SpringBoot引入WebSocket依赖报ServerContainer no avaliable_第1张图片
    SpringBoot引入WebSocket依赖报ServerContainer no avaliable_第2张图片
  2. 重新启动,发现问题已经解决。

你可能感兴趣的:(javaWeb,spring,boot,websocket,java)