一、创建websocket服务类

这里就不详细介绍了(借鉴一下前辈们的经验),很多这方面的例子;

自己手工使用idea搭建springboot demo框架运行Application;这些都能正常运行,

如果不能正常运行,仔细检查下“砖头”是否码错了,或者开发环境是否正常搭建。

经过这一系列的修正。这个由你手工搭建的项目一定是能正常运行,并且已经完成了websocket功能的前后端实现。

二、但是这仅仅是个开始!!!!!!

进入正轨!问题所在!!

当你开心的将这个demo按部就班的整合拷贝进你自己的项目的时候。问题来了!

第一:错误:(一堆debug异常提示,然后试着去百度,去谷歌,然而没R用)

2020-05-29 15:36:59.541 ERROR 5988 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'serverEndpointExporter' defined in class path resource [com/resource/websocket/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:1771)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:847)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:391)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
	at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:140)
	at com.hsioc.core.launch.PlatformApplication.run(PlatformApplication.java:34)
	at com.hsioc.resource.ResourceApplication.main(ResourceApplication.java:19)
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:1830)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1767)
	... 16 common frames omitted

第二:错误:(百度、谷歌搜索了一圈,发现提示的都是test测试类的问题,也有一些其他的;改来改去,发现并没R用;获许有一些博客提示了,问题出在WebSocketConfig 这个类里面。事实是这样吗?那么让我们修改一些这个类。)

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;


/**
 * 开启WebSocket支持
 * @author sk
 */
@Configuration
public class WebSocketConfig {
	@Bean
	public ServerEndpointExporter serverEndpointExporter() {
		return new ServerEndpointExporter();
	}

}

第三:错误:(是不是很兴奋,以为这样就万事大吉了。然后接踵而来的还是bug)

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.ServletContextAware;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

import javax.servlet.ServletContext;


/**
 * 开启WebSocket支持
 * @author sk
 */
@Configuration
public class WebSocketConfig {
	@Bean
	public ServletContextAware endpointExporterInitializer(final ApplicationContext applicationContext) {
		return new ServletContextAware() {
			@Override
			public void setServletContext(ServletContext servletContext) {
				ServerEndpointExporter exporter = new ServerEndpointExporter();
				exporter.setApplicationContext(applicationContext);
				exporter.afterPropertiesSet();
			}
		};
	}
}
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2020-05-29 15:46:04.348 ERROR 6944 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'endpointExporterInitializer' defined in class path resource [com/resource/websocket/WebSocketConfig.class]: Initialization of bean failed; nested exception is java.lang.IllegalStateException: javax.websocket.server.ServerContainer not available
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:847)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:391)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
	at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:140)
	at com.hsioc.core.launch.PlatformApplication.run(PlatformApplication.java:34)
	at com.hsioc.resource.ResourceApplication.main(ResourceApplication.java:19)
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 com.hsioc.resource.websocket.WebSocketConfig$1.setServletContext(WebSocketConfig.java:25)
	at org.springframework.web.context.support.ServletContextAwareProcessor.postProcessBeforeInitialization(ServletContextAwareProcessor.java:108)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:414)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1763)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593)
	... 15 common frames omitted

第四:(终于正常了!!小伙伴们一定想问问题出在哪里,又是怎么解决的。)

细心的同学一定发现了当使用debug调试模式下启动Application时;

exporter.setApplicationContext(applicationContext);这个方法会将applicationContextset进exporter这个对象里去,但是如果你仔细去看setApplicationContext这个方法你会发现exporter.serverContainer=null。问题就出现在这里!

依然是百度、谷歌最终结果出在pom.xml里面。(也就是说TM一开始就错了!!!!这或许就是回归本源吧!!!)

<!--websocket-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

总结:

          bug很多,怎么解决bug成了难点。(有幸存在debug这个神奇的功能)用断点抽丝剥茧的一层层的嵌套查源码,总会查出问题所在。

言而总之总而言之:耐心和毅力是解决bug的必要条件。