网站建设企业文化,焦作会做网站制作的有哪家,敬请期待哦,微信公众号电商网站开发事件背景
同事反馈#xff0c;相同的jar包#xff0c;在多人本地的电脑、多台服务器中#xff0c;都是可以正常启动的#xff0c;只有在其中一台服务器#xff0c;简称它为A#xff0c;无法启动#xff0c;因为启动后的初始化操作中有一个调用mybatis方法的操作#x…事件背景
同事反馈相同的jar包在多人本地的电脑、多台服务器中都是可以正常启动的只有在其中一台服务器简称它为A无法启动因为启动后的初始化操作中有一个调用mybatis方法的操作
但是调用该方法后出现 Invalid bound statement (not found): xxxxx 说这个方法没有绑定上的错误。
调查
去观察了一下代码的配置 mapper-locations: classpath*:com/cm/qrpmp/**/xml/*.xml 好像也并没有什么不对的地方再加上我自己的电脑本地验证了一下依然可以正常启动
于是想着远程debug一下A服务器上不行的时候的堆栈情况开启远程debug模式
java -agentlib:jdwptransportdt_socket,servery,suspendn,address5005 -jar YourApp.jar来到这个位置后观察了一下当时的 configuration 情况发现其中的mapper映射确实没有我们想要的于是观察了一下当时的mapper方法扫描的数量大概是1145个 随后我们在本地也启动了调试在这个位置发现扫描出来的mapper方法是1445个多了300个也就是说服务器上并没有扫描到和本地一样的方法数量奇怪的是其他服务器是可以的
这个过程中我们检查了打包后的配置文件、以及xml文件有没有被打包进去发现都是正确的
继续追踪
于是想看一下mybatis plus在扫描我们指定的路径过程中发生了什么
这里追踪到了MyBatisSqlSessionFactoryBean的buildSqlSessionFactory方法这里在这里发现 mapperLocations 是一个空的对象说明这里并没有被注入
于是再向上追踪一下这个对象从什么地方注入的发现他在 MybatisPlusAutoConfiguration中的 sqlSessionFactory 方法这里进行注入 其来源自 MybatisPlusProperties 中的 resolveMapperLocations 方法 于是再这里打了断点调试后真相即将出现了在A这台服务器上这里出现的路径竟然不是我们配置中写的而是另一个毫不相干的
所以问题出现了在哪里因为这个错误的配置是另一个jar中的一度怀疑是不是云服务器出现了缓存啥的读取信息错误。。。
于是换个路径启动发现正常了。。。。 回到原本的路径就不行再细看这个路径下有一个config目录。。。。 config目录里有spring boot的 yaml 配置文件而这个配置文件中的路径就是刚刚debug出错误的路径。。。。
把这个文件删除后启动又正常了。。。 所以瞬间怀疑spring boot 默认读取了这个文件中的配置
解决
在本地验证了一下发现确实如此如果jar的同目录中存在一个config目录里面有yaml文件的话 spring boot默认会读这个所以出现了这个乌龙
spring boot的读取顺序https://blog.csdn.net/qq_52139871/article/details/124872875
所以最终其实是spring boot对yaml文件读取顺序导致的问题我们一直以为它会读jar包中的没想到这个config目录 近水楼台先得月了。
PS其他服务器可以是因为他在其他服务器启动的时候又手动指定了spring.config.locationA这台直接用了java -jar 没指定所以默认读了当前的config下。。。总之各方面的原因导致了问题的出现这里又验证了多了解源码实现也是有好处的掌控你所使用的东西