三、解决问题基于 Spring Cloud Alibaba Gateway Nacos RocketMQ Vue & Element 实现的后台管理系统 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://gitee.com/zhijiantianya/yudao-cloud
视频教程:https://doc.iocoder.cn/video/
通过这个文章上面的分析可以确认是因为ServerEndpoint类有一个对象为空的ExserverContainer,所以它会为空。
就需要,服务器容器这个对象是在哪里的,找源头就只有两个地方了,这就好办了。
public class ServerEndpointExporter extends WebApplicationObjectSupport
implements InitializingBean, SmartInitializingSingleton {
@Nullable
private List<Class<?>> annotatedEndpointClasses;
@Nullable
private ServerContainer serverContainer;
// 有一个Set方法可以为serverContainer赋值
public void setServerContainer(@Nullable ServerContainer serverContainer) {
this.serverContainer = serverContainer;
}
@Nullable
protected ServerContainer getServerContainer() {
return this.serverContainer;
}
// 有一个init方法可以为serverContainer赋值
@Override
protected void initservletContext(ServletContext servletContext) {
if (this.serverContainer == null) {
this.serverContainer =
(ServerContainer) servletContext.getAttribute("javax.websocket.server.ServerContainer");
}
}
@Override
public void afterPropertiesSet() {
Assert.state(getServerContainer() != null, "javax.websocket.server.ServerContainer not available");
}
}
通过IDEA的快捷方式,发现没有其他地方调用setServerContainer方法,那么只有init方法了,那么就断点卡在initServletContext方法了。
通过Bebug的能力发现,在从servletContext.getAttribute,根本就没有返回javax.websocket.ServerContainer,就是一个null的时候,结果就产生了异常给serverContainer,所以就产生了异常。
「那为什么javax.websocket.server.ServerContainer会不存在呢?」
这个类,原来是一个接口,那个ServerContainer肯定有的实现类,通过IDEA查看好人,到这个小编大概就明白了这个项目的其他jar包,引发了冲突。
最后到是哪个罐子最后突破了,直接通过IDEA功能就能够定位到,通过maven helper工具定位到maven引用位置,然后移除掉。