springboot整合websocket后启动报错(javax.websocket.server.ServerContainer not available)

 更新时间:2024年01月15日 14:57:09   作者:清如许.  
这篇文章主要介绍了springboot整合websocket后启动报错(javax.websocket.server.ServerContainer not available),通过分析错误信息、排查代码和配置,找出问题的根源,并给出相应的解决方案,感兴趣的可以了解一下

一、场景

Springboot使用@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();  
    }  
}

二、报错信息

springboot项目添加websocket依赖后运行测试类报如下错误:

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2024-01-15 10:27:30.908 ERROR 20552 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'serverEndpointExporter' defined in class path resource [org/springblade/lab/external/webScoket/WebSocketConfig.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: javax.websocket.server.ServerContainer not available
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
    at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$211/1936375962.getObject(Unknown Source)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:929)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:591)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:409)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:308)
    at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:164)
    at org.springblade.core.launch.BladeApplication.run(BladeApplication.java:49)
    at org.springblade.Application.main(Application.java:33)
Caused by: java.lang.IllegalStateException: javax.websocket.server.ServerContainer not available
    at org.springframework.util.Assert.state(Assert.java:76)
    at org.springframework.web.socket.server.standard.ServerEndpointExporter.afterPropertiesSet(ServerEndpointExporter.java:107)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)
    ... 17 common frames omitted

三、排查思路

报的错误是创建ServerEndpointExporterBean失败,原因是ServerContainer不可用,那么我们就去看到ServerContainer在ServerEndpointExporter中是怎么注入的。

点进去ServerEndpointExporter()类,
在第49行代码打上debug跑一下

在这里插入图片描述

选中第50行代码,右键,执行计算,或者使用快捷键Crtl+U

在这里插入图片描述

计算结果发现是null

在这里插入图片描述

四、分析原因

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

点进去getAttribute方法,查看实现类

在这里插入图片描述

这里有五个实现类,三个是tomcat的,一个是undertow的,还有一个是springframework的,所以解决办法就是排除掉其他的实现类,只保留springframework这个就行。

五、解决办法

安装Maven Helper插件,打开项目的pom.xml文件,点击pom文件左下角的Dependency Analyzer排除掉多余的依赖。

在这里插入图片描述

最终结果:

      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!--添加以下排除方法-->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

    <!--websocket服务-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
             <!--添加以下排除方法-->
            <exclusions>
                <exclusion>
                    <artifactId>spring-boot-starter-web</artifactId>
                    <groupId>org.springframework.boot</groupId>
                </exclusion>
            </exclusions>
        </dependency>

再次启动,一切正常!

到此这篇关于springboot整合websocket后启动报错(javax.websocket.server.ServerContainer not available)的文章就介绍到这了,更多相关springboot websocket启动报错内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring boot框架下的RabbitMQ消息中间件详解

    Spring boot框架下的RabbitMQ消息中间件详解

    这篇文章详细介绍了Spring Boot框架下的RabbitMQ消息中间件的基本概念、消息传输模型、环境准备、Spring Boot集成以及消息生产和消费,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • Mybatis实现分页的注意点

    Mybatis实现分页的注意点

    Mybatis提供了强大的分页拦截实现,可以完美的实现分功能。下面小编给大家分享小编在使用拦截器给mybatis进行分页所遇到的问题及注意点,需要的朋友一起看看吧
    2017-07-07
  • IntelliJ IDEA设置Tabs实现同时打开多个文件且分行显示

    IntelliJ IDEA设置Tabs实现同时打开多个文件且分行显示

    今天小编就为大家分享一篇关于IntelliJ IDEA设置Tabs实现同时打开多个文件且分行显示,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • Struts2框架初学接触

    Struts2框架初学接触

    本文主要给大家从初学者的角度介绍了Struts2框架结构和基本页面代码等内容,一起来学习一下。
    2017-11-11
  • IDEA解决maven包冲突easypoi NoClassDefFoundError的问题

    IDEA解决maven包冲突easypoi NoClassDefFoundError的问题

    这篇文章主要介绍了IDEA解决maven包冲突easypoi NoClassDefFoundError的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 详解Java中的mapstruct插件使用

    详解Java中的mapstruct插件使用

    mapstruct 的插件是专门用来处理 domin 实体类与 model 类的属性映射的,我们只需定义 mapper 接口,mapstruct 在编译的时候就会自动的帮我们实现这个映射接口,避免了麻烦复杂的映射实现,对Java mapstruct使用相关知识感兴趣的朋友一起看看吧
    2022-04-04
  • Netty通道的容器属性Attribute详解

    Netty通道的容器属性Attribute详解

    这篇文章主要介绍了Netty通道的容器属性Attribute详解,Netty中的Channel通道类,有类似于Map的容器功能,可以通过键值对的形式来保存任何Java Object的值,一般来说可以存放一些与通道实例相关联的属性,比如说服务期端的ServerSession会话实例,需要的朋友可以参考下
    2023-12-12
  • springboot实现postman中form-data传参实现过程

    springboot实现postman中form-data传参实现过程

    在项目场景开发中,对接需求要求使用POST请求传form-data数据,使用HttpClient请求时遇到了415错误,后改为restTemplate,封装参数时使用LinkedMultiValueMap对象以解决参数无法正确解析的问题
    2026-04-04
  • 详解如何获取java中类的所有对象实例

    详解如何获取java中类的所有对象实例

    如何在运行时获取一个Java类的所有对象实例呢,本文给大家介绍一种底层实现的方式,基于jvmti,代码用C++实现,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • SpringBoot Arthas实现线上监控诊断

    SpringBoot Arthas实现线上监控诊断

    本文主要介绍了SpringBoot Arthas实现线上监控诊断,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-03-03

最新评论