百摩网
当前位置: 首页 生活百科

springboot-jar启动很慢(记一次SpringBoot启动异常)

时间:2023-06-01 作者: 小编 阅读量: 2 栏目名: 生活百科

本文主要来记录一下,如果没有百度在自己的项目启动就抛开一些奇怪的问题,或者有一些奇奇怪怪的问题,靠自己怎么排查问题,另一种引擎去清除所有的问题都能够通过搜索来解决。除了力,那我们就只剩下:“异常信息、来源、和自己的经验”。项目框架用的是SpringBoot,然后集成WebSocket就行,在集成的过程中,其中有一步需要配置一个Bean。

  • 一、引言
  • 二、问题分析
  • 三、解决问题
  • 四、划重点

一、引言

小编最近接了个成功的服务端项目,在他们项目中集成了一个WebSocket,嗯,其实不难,有很多成功案例。

本文主要来记录一下,如果没有百度在自己的项目启动就抛开一些奇怪的问题,或者有一些奇奇怪怪的问题,靠自己怎么排查问题,另一种引擎去清除所有的问题都能够通过搜索来解决。

除了力,那我们就只剩下:“异常信息、来源、和自己的经验”

项目框架用的是SpringBoot,然后集成WebSocket就行,在集成的过程中,其中有一步需要配置一个Bean。

@Componentpublic class WsConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {ServerEndpointExporter serverEndpointExporter = new ServerEndpointExporter();return serverEndpointExporter;}}

然后在项目启动的时候抛出了异常信息:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'serverEndpointExporter' defined in class path resource [org/springblade/modules/hol/config/WsConfig.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: javax.websocket.server.ServerContainer not availableat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1769)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:514)at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:321)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:319)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:863)at org.Springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)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 org.springblade.core.launch.BladeApplication.run(BladeApplication.java:50)at org.springblade.Application.main(Application.java:18)Caused by: java.lang.IllegalStateException: javax.websocket.server.ServerContainer not availableat 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:1828)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1765)... 16 common frames omitted

基于 Spring BootMyBatis PlusVue & Element 实现的后台管理系统用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

项目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

视频教程:https://doc.iocoder.cn/video/

二、问题分析

该类路径资源 [org/springblade/modules/hol/config/WsConfig.class] 中定义名称为“serverEndpointExporter”的 bean 创建错误:调用 init 方法失败;嵌套异常是 java.lang.IllegalStateException: javax.websocket.server.ServerContainer 不可用

通过异常的第一行就可以得知,是在 Spring 创建“serverEndpointExporter”beanW 的时候抛出来的,是这个配置类,原因是:ServerContainer 这个对象不可使用。

抛出异常的类是:AbstractAutowireCapableBeanFactory.java:1769

分析这里就可以得知,是在spring创建serverEndpoint的时候异常了, “那么异常的原因是Exporter ,为什么ServerContainer不可用呢?” 接下来分析

通过点击转换的源码信息:AbstractAutowireCapableBeanFactory.java:1769

protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {if (System.getSecurityManager() != null) {AccessController.doPrivileged((PrivilegedAction<Object>) () -> {invokeAwareMethods(beanName, bean);return null;}, getAccessControlContext());}else {invokeAwareMethods(beanName, bean);}Object wrappedBean = bean;if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);}try {invokeInitMethods(beanName, wrappedBean, mbd);}catch (Throwable ex) {throw new BeanCreationException(// 1769 这里就是1769行~~(mbd != null ? mbd.getResourceDescription() : null),beanName, "Invocation of init method failed", ex);}if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}return wrappedBean;}

通过查看源码,是在1796行的catch里面抛出的异常的,catch是捕捉到invokeInitMethods这个异常的方法,然后才抛出来的,这样就可以开始调试了。

我们是在创建serverendpointExporter的,加一个筛选条件beanName为serverEndpointExporter,这样再过滤创建异常的其他bean。

断点卡好,下调试模式来启动项目,然后F5进到vokeInitMethods,单步往下执行。

最后执行到了 ((InitializingBean) bean).afterPropertiesSet(); 这行代码,bean方法对象是ServerEndpointExporter,调用了这个对象的afterPropertiesSet。

这个ServerEndpointExporterjava类,其中就有在获取serverPropertiesSet方法之后,首先调用这个getServerContainer方法获取serverContainer对象。

很明显这里返回的肯定是null,null != null 结果肯定是false,最后就是这样调用state(false,javax.websocket.server.ServerContainer not available)

通过state源知道,最后抛出这个异常:java.lang.IllegalStateContainerException: javax.websocket.server.server not available

基于 Spring Cloud AlibabaGatewayNacosRocketMQVue & Element 实现的后台管理系统用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

项目地址:https://gitee.com/zhijiantianya/yudao-cloud

视频教程:https://doc.iocoder.cn/video/

三、解决问题

通过这个文章上面的分析可以确认是因为ServerEndpoint类有一个对象为空的ExserverContainer,所以它会为空。

就需要,服务器容器这个对象是在哪里的,找源头就只有两个地方了,这就好办了。

public class ServerEndpointExporter extends WebApplicationObjectSupportimplements InitializingBean, SmartInitializingSingleton {@Nullableprivate List<Class<?>> annotatedEndpointClasses;@Nullableprivate ServerContainer serverContainer;// 有一个Set方法可以为serverContainer赋值public void setServerContainer(@Nullable ServerContainer serverContainer) {this.serverContainer = serverContainer;}@Nullableprotected ServerContainer getServerContainer() {return this.serverContainer;}// 有一个init方法可以为serverContainer赋值@Overrideprotected void initservletContext(ServletContext servletContext) {if (this.serverContainer == null) {this.serverContainer =(ServerContainer) servletContext.getAttribute("javax.websocket.server.ServerContainer");}}@Overridepublic 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引用位置,然后移除掉。

一下maven,项目就正常启动啦~~~~~~

四、划重点

本文针对某个异常、或者某个具体问题的另外来进行分析,分享解决这个异常的一个过程。

最开始的小井刚毕业那会,遇到个个,运气就过好,人都踩到这个了,解决这个问题,一时也找不到很多合适的文章,然后能力,然后话就坑了咋知道办。

肯定没有其他人通过自己的问题来解决问题,而且通过自己发现问题的过程来解决自己的问题。

也有很多小伙伴问过小编,学习一些框架源码有什么用?会用不就行了吗?

怎么办呢?真的会说到底怎么办呢,那么你的话,这些奇怪的东西是怎么实现的?深层次的理解。

久而久之之,遇到主动问题,你去摸索的第一个反应自己去百度,会直接为啥子看看的异常情况,分析一下不明的源头,再去学习,进行进行。

就这样不知不觉你的技术会慢慢升华,那个时候感觉就特别明显了。

原文链接:https://mp.weixin.qq.com/s/ppc0rwyhmenr33knyD5yDA

,
    推荐阅读
  • 女人正能量发圈句子(女人正能量发圈句子有哪些)

    女人正能量发圈句子你是我心尖人,枕边人,最后必定是我同棺人。干吗为了你和全世界作战。我选择淡忘,让时光巨大的力量抚平痛苦,把伤痕变成勋章。人世间最长的距离不是生与死,而是星期一到星期六。女人一生最美的时刻,是穿着拖尾婚纱嫁给挚爱的他。世界上最奢侈的人,就是肯花时间陪你的。勇于追求是一种精神,懂得放弃是一种境界。真正的爱从来无关风月,只在平淡的流年里变作永恒。

  • 梦幻西游自己怎么刷成就(梦幻西游:你不知道的刷成就方法)

    梦幻西游自己怎么刷成就很多人想刷成就的时候都很困扰!可以找小伙伴一起去刷,也方便完成3000好友度的成就。比较难的是稀有怪物战斗这个成就,这些成就就不勉强了,几率的东西需要看脸。总结:场景战斗这一大块,排除了稀有怪物相关的,基础的成就能拿到494点。卡牌类需要双开:卡牌、五子棋、乾坤盘、数独、猜拳、大富翁。至少获得7点成就。组队的全部可以刷完,单人的有些剧情就打不过了,人物和BB需求的配置比较高。

  • 南京房贷和存量商业住房贷款同步下调吗

    在此之前,全国层面执行的利率下限是首套房贷利率不得低于相应期限的LPR,二套房贷利率不得低于相应期限LPR加60个基点。政策调整后,按照4月20日发布的5年期以上LPR测算,首套房贷利率不得低于4.4%。夫妻双方均缴存公积金且共同借款的,贷款额度为夫妻双方分别计算的贷款额度之和。配偶为军官或士官的根据已有住房套数同档次个人贷款最高限额计算。

  • 炒蒜薹怎么不糊(易糊是因为你没有注意这一个技巧)

    一般蒜苔的烹饪方法都是炒,可以为菜肴增添色香味,但是炒的时间不能太长,太长的话会破坏蒜苔中的辣素,导致其作用丧失,而且也会是蒜苔口感大打折扣。蒜苔不宜与韭菜、大葱、蜂蜜等一起食用,这样不利于人体营养物质的消化和吸收。蒜苔属于发物,所以身体不适的小伙伴们尽量避免蒜苔的食用。

  • 云浮压片糖果加工厂家(山西瑞芝生物科技公司蓝莓叶黄素酯压片糖果着色剂超标)

    云浮压片糖果加工厂家2021年11月17日,山西省市场监督管理局发布2021年第34期食品安全监督抽检信息通告。苋菜红又名蓝光酸性红,偶氮类化合物,是常见的食品合成着色剂。长期低剂量摄入,可能对人体健康有一定影响。糖果制品中苋菜红超标的原因,可能是生产企业超限量、超范围使用,或者未准确计量。2019年12月荣获山西省农业产业化领导组颁发的“山西省农业产业化省级重点龙头企业”等多项荣誉。

  • 都说双下巴的人有福气(双下巴的人会晚年很幸福)

    丰颔重颐,旺夫兴家,意即下巴丰满且有双下巴的女子,属帮夫运面相中的褔相。下巴长得圆满的女子,容易相处,善解人意。下巴圆润有肉者属享受型面相,有领导才能,受人拥戴,对丈夫事业非常有利。此外,腮骨最好有点显露,但非突出那种,要有肉包住才好。以这种女子为妻,丈夫会非常幸福,因为她们是标准的贤内助,相当体贴,开朗大方,温和敦厚,是可以信赖相守的终身伴侣。

  • 地震来临前有哪些征兆(大地震来临前的6大征兆)

    5、地光异常地震前会从地下射出许多的光,其颜色多种多样,而且形状也多种多样。

  • 紫乐多肉怎么养(紫乐多肉如何养)

    土壤,在养殖紫乐多肉植物时使用松软且透气的土壤,,下面我们就来聊聊关于紫乐多肉怎么养?接下来我们就一起去了解一下吧!紫乐多肉怎么养土壤,在养殖紫乐多肉植物时使用松软且透气的土壤,阳光,有良好的光照,它看起来才会更为紧凑,定期转动花盆位置,让整个植株受光均匀,水分,在生长期要不干不浇,尽量让土维持湿润,过冬,它是不耐寒冷的,要放在室内温暖的地方养护。

  • 公螃蟹怎么做好吃(炒螃蟹的家常做法)

    公螃蟹怎么做好吃首先需要把螃蟹的腹部向上,用竹针刺入蟹脐,螃蟹即死。将螃蟹放在水中,用刷子用力刷洗干净。斩下蟹脚,将蟹爪切去不用。将蟹钳去毛,一破两半,再切成两截。将蟹身片成两半,再斩成2厘米宽的块,一同放入盘里。将盐、胡椒粉撒在螃蟹上拌匀,再撒上面粉拌匀备用。将大葱洗净取葱白切末、姜切丝、香菜洗净去掉叶备用。

  • 交定金多久未提车算违约 买车交了定金多长时间不提车算违约

    一部分交通违章能够同时在网络上缴纳,点一下违法处理业务流程的“缴纳罚款”,阅读文章注意事项后启用开展下一步。