MyBatis无法读取XML中的Method的乌龙事件

事件背景

同事反馈,相同的jar包,在多人本地的电脑、多台服务器中,都是可以正常启动的,只有在其中一台服务器,简称它为A,无法启动,因为启动后的初始化操作中有一个调用mybatis方法的操作,

但是调用该方法后,出现 Invalid bound statement (not found): xxxxx ,说这个方法没有绑定上的错误。

调查

去观察了一下代码的配置: mapper-locations: classpath*:com/cm/qrpmp/**/xml/*.xml 好像也并没有什么不对的地方,再加上我自己的电脑本地验证了一下,依然可以正常启动,

于是想着远程debug一下A服务器上不行的时候的堆栈情况,开启远程debug模式

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -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.location,A这台直接用了java -jar 没指定,所以默认读了当前的config下。。。)总之,各方面的原因导致了问题的出现,这里又验证了多了解源码实现也是有好处的,掌控你所使用的东西

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/128598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11.Linux系统:定时任务备份mysql数据库为文件并传输到其他服务器

1. 创建脚本 mysql_dumps.sh内容如下: #!/bin/bash # 查找名称为“mysql_mysql”的容器id CONTAINER_IDdocker ps -a | grep "mysql_mysql" | awk {print $1} | head -n 1 MYSQL_USERNAME"root" MYSQL_PASSWORD"root" FILENAME_SU…

【CSDN 每日一练 ★★☆】【动态规划】最小路径和

【CSDN 每日一练 ★★☆】【动态规划】最小路径和 动态规划 题目 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例 示例 1&#x…

我的云栖大会之旅:见证云计算创新的15年

云栖大会,曾经是一次不可思议的科技之旅,却如今已见证了我对云计算世界的15年关注和发展。第一次踏上云栖大会之旅,我记得是在2009年。那时的云计算还是一个新生事物,而云栖大会正是其中的奠基石。 我清楚地记得那个炎热的夏天&am…

ant-design-vue select选择框无法显示placehoder

将绑定的对应值设置成undefined <a-selectv-model:value"formState.classification"option-filter-prop"children"allow-clearplaceholder"商户分类"><a-select-optionv-for"item of Object.values(Const.POINTMERCHNANDISE.TYPE…

R -- 体验 stringdist

文章目录 安装使用stringdist :返回列表example stringdistmatrix &#xff1a;返回矩阵example amatch & ain延伸&#xff1a;距离计算公式Hamming distanceLongest Common Substring distanceLevenshtein distance (weighted)The optimal string alignment distance dosa…

“解耦表示学习”+“交互作用(效应)+权衡 (Trade-off)”是什么?

一、解耦表示学习 一个例子说明问题&#xff1a; 假设我们有一组人脸图像。图像中的每张人脸都可能由多种因子组成&#xff0c;如面部表情、发型、眼镜、性别等。解耦表示学习的目标是找到一种表示方法&#xff0c;其中每一部分的表示只对应于一个因子&#xff0c;如一个特征…

UDP服务端和客户端通信代码开发流程

一、UDP通信 TCP&#xff1a;传输控制协议&#xff0c;面向连接的&#xff0c;稳定的&#xff0c;可靠的&#xff0c;安全的数据集流传递 稳定和可靠:丢包重传 数据有序:序号和确认序号 流量控制:稳定窗口 UDP&#xff1a;用户数据报协议 面向无连接的,不稳定的,不可靠,不安…

JMeter的使用,傻瓜式学习【上】

目录 前言 1、JMeter元件及基本使用作用域&#xff08;简述&#xff09; 1.1、基本元件 1.2、作用域的原则 1.3、元件执行顺序 2、JMeter三个重要组件 2.1、线程组 案例&#xff1a; 2.2、HTTP请求 2.3、查看结果树 响应体中&#xff0c;中文乱码解决方案&#xff1…

docker部署Jenkins(Jenkins+Gitlab+Maven实现CI/CD)

GitLab介绍 GitLab是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务&#xff0c;可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能&#xff0c;能够浏览源代码&#xff0c;管理缺陷和注释。…

学习笔记三十一:k8s安全管理:认证、授权、准入控制概述SA介绍

K8S安全实战篇之RBAC认证授权-v1 k8s安全管理&#xff1a;认证、授权、准入控制概述认证k8s客户端访问apiserver的几种认证方式客户端认证&#xff1a;BearertokenServiceaccountkubeconfig文件 授权Kubernetes的授权是基于插件形成的&#xff0c;其常用的授权插件有以下几种&a…

家庭互动新维度:TikTok的亲子体验

在数字时代&#xff0c;家庭互动的方式正在发生翻天覆地的改变。社交媒体平台TikTok崭露头角&#xff0c;不仅在年轻用户中广受欢迎&#xff0c;还为家庭带来了全新的互动维度。本文将深入探讨TikTok如何成为家庭互动的新元素&#xff0c;以及它如何改变亲子体验。 TikTok&…

“连续的数据类型”与“非连续的数据类型”是什么?

今天读到“不同于以往基于微分的优化思路&#xff0c;基于差分的零阶优化算法更加适合于处理非连续的数据类型&#xff0c;像化学分子的SMILES表示或者多肽的序列表示就是这样的类型。” 特此记录下来 一、连续的数据类型 连续数据类型指的是在其值域内可以任意细分&#xff…

后端神器!代码写完直接调试!

Apipost推出IDEA插件非常省时高效&#xff0c;写完代码直接可以进行调试&#xff0c;而且支持生成接口文档&#xff0c;真是后端神器啊&#xff01; 可以点击下方链接安装更新或在插件商店中搜索安装 下载链接&#xff1a;https://plugins.jetbrains.com/plugin/22676-apipos…

python飞书群机器人通过webhook发送消息

python飞书群机器人通过webhook发送消息 import json import loggingimport requestslogger logging.getLogger(__name__) logging.basicConfig(levellogging.DEBUG)class FeishuTalk:"""飞书群机器人通过webhook发送消息"""def __init__(self…

微课录屏软件哪个好?帮你轻松搞定课程录制

微课作为一种新型的教学方式&#xff0c;因其短小精悍、内容丰富等特点&#xff0c;越来越受到广大师生的喜爱。在制作微课时&#xff0c;选择一款合适的录屏软件显得尤为重要。可是微课录屏软件哪个好呢&#xff1f;本文将详细介绍两款微课录屏软件&#xff0c;并进行全方位对…

【LeetCode算法-07】 翻转整数 问题

翻转整数是指将一个整数从末尾开始&#xff0c;以相反的顺序重新排列它的数字。例如&#xff0c;翻转整数123的结果是321。注意&#xff0c;这个过程只涉及到整数的数字部分&#xff0c;不包括正负号。 下面是如何在Java中实现这个功能&#xff1a; 如果输入的整数是负数&…

21款奔驰GLS450升级23P驾驶辅助 智驾出行

驾驶辅助和自动驾驶的区别就是需要人为去接管&#xff0c;虽然车辆会根据道路自己行驶&#xff0c;弯道上也能居中自动修正行驶&#xff0c;长时间不接管方向盘&#xff0c;系统会提示人为接管&#xff0c;这就是奔驰的23P驾驶辅助系统&#xff0c; 很多车友升级23P驾驶辅助系…

探索数据库世界的奥秘:MySQL初学者必备指南!

数据库开发-MySQL 1. 数据库操作-DQL1.1 介绍1.2 语法1.3 基本查询1.4 条件查询1.5 聚合函数1.6 分组查询1.7 排序查询1.8 分页查询1.9 案例1.9.1 案例一1.9.2 案例二 2. 多表设计2.1 一对多2.1.2 外键约束 2.2 一对一2.3 多对多 1. 数据库操作-DQL 1.1 介绍 DQL英文全称是Da…

高性能渲染——详解Html Canvas的优势与性能

本文由葡萄城技术团队原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 一、什么是Canvas 想必学习前端的同学们对Canvas 都不陌生&#xff0c;它是 HTML5 新增的“画布”元素&#x…

四十一、【进阶】索引使用SQL提示

1、SQL提示使用情景 在使用MySQL时&#xff0c;当一个字段参在于多个索引中时&#xff0c;默认情况下&#xff0c;MySQL会自动选择一个索引&#xff0c;但我们可以指定索引吗&#xff1f;可以忽略某一种索引吗&#xff1f; 答案是可以的。 前提&#xff1a;profession字段已经…