JAVA: Java.lang.IllegalStateException javax.websocket.server.ServerContainer not availableJ

丁志勇
2023-12-01

1、错误信息

在使用springboot单元测试出现:

Caused by: java.lang.IllegalStateException: javax.websocket.server.ServerContainer not available
	at org.springframework.util.Assert.state(Assert.java:73)
	at org.springframework.web.socket.server.standard.ServerEndpointExporter.afterPropertiesSet(ServerEndpointExporter.java:107)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1855)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792)
	... 80 more

2、错误原因:

spring boot内带tomcat,tomcat中的websocket会有冲突出现问题

3、错误解决:

1、注释掉WebSocket注解,也就是:WebSocketConfig 上的注解信息(不建议)

@Configuration
@EnableWebSocket 
public class WebSocketConfig {
}

2、在springboot测试类上加webEnvironment

@SpringBootTest(classes = {APP.class},webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

使用@SpringBootTest后,Spring将加载所有被管理的bean,基本等同于启动了整个服务,此时便可以开始功能测试。

由于web服务是最常见的服务,且我们对于web服务的测试有一些特殊的期望,所以@SpringBootTest注解中,给出了webEnvironment参数指定了web的environment,该参数的值一共有四个可选值:

  • MOCK:此值为默认值,该类型提供一个mock环境,可以和@AutoConfigureMockMvc或@AutoConfigureWebTestClient搭配使用,开启Mock相关的功能。注意此时内嵌的服务(servlet容器)并没有真正启动,也不会监听web服务端口。
  • RANDOM_PORT:启动一个真实的web服务,监听一个随机端口。
  • DEFINED_PORT:启动一个真实的web服务,监听一个定义好的端口(从application.properties读取)。
  • NONE:启动一个非web的ApplicationContext,既不提供mock环境,也不提供真实的web服务。

如果当前服务的classpath中没有包含web相关的依赖,spring将启动一个非web的ApplicationContext,此时的webEnvironment就没有什么意义了。

 类似资料:

相关阅读

相关文章

相关问答