记录mybatis排查bug过程中遇到的坑

在使用公司内部数据库连接注解时,项目在本地写单元测试mybatis mapper出现了以下的bug.于是就开始了我长达一天的排查之旅,期间遇到了各位可能会遇到的坑,这里贴出来帮大家避雷。

sh 复制代码
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: io.shardingjdbc.core.exception.ShardingJdbcException: io.shardingjdbc.core.exception.ShardingJdbcException: java.sql.SQLException: Error
### The error may exist in file [/Users/******/IdeaProjects/umepsr-partnersub/umepsr-partnersub-aq/target/classes/mappers/Mapper.xml]
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: select           PXID,         CERTID,         CERTTYPE,                 SOURCE,         STARTDATE,         ENDDATE,         STATUS,         SUBSCRIBETYPE,         CREATETIME,         UPDATETIME       from          where SUBSCRIBETYPE = ? and CERTID =? and CERTTYPE = ?
### Cause: io.shardingjdbc.core.exception.ShardingJdbcException: io.shardingjdbc.core.exception.ShardingJdbcException: java.sql.SQLException: Error

第一坑:虚晃一枪

按照报错的指引,我找到了打包后Target文件夹中的Mapper文件。

The error may exist in file [/Users/******/IdeaProjects/umepsr-partnersub/umepsr-partnersub-aq/target/classes/mappers/Mapper.xml]

如图所见,我当时看到这个我真的以为自己遇见了鬼。

是的,同一个mapper文件在开发时不爆红,但是编译入target中他爆红了。搞得我一度以为是我写的mapper文件语法有问题。

经过我与通过其他生产环境上正常项目比对后,我十分确认这个mapper文件爆红的地方他没问题,况且正常目录中他也没报错啊,侧面证实了我的观点。

排除所有错误答案,剩下的再离谱也是正确答案,那就是最新版的IDEA仍存在这样一个bug。在target目录中获取上下文存在bug,导致refid中的内容不能绑定识别到。

而且,在经过invalidate cache后,这个爆红仍然没有解决。

于是,我索性不管他了。

第二坑:雪上加霜

这个坑,纯纯我自己搞出来的。

在不甘心,被bug打败的调试挣扎中,我尝试搜索这个bug是什么原因。

查到的答案是很有可能,是数据库没连接上。原因在于:mybatis-spring-1.3.2中取消了自动注入SqlSessionFactory 和 SqlSessionTemplate

需要手动加入一下依赖,就会注入SqlSessionFactory 和 SqlSessionTemplate

xml 复制代码
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>1.3.2</version>
</dependency>

结果一加一个不吭声,报错确实变了,不报原来的错,但是这次的报错更离谱。

下面的报错信息,无限循环。报错信息过长,不方便截图。

根据这位老哥的经验Caused by: java.lang.StackOverflowError-CSDN博客 通过排查,删除了项目中 log4j-over-slf4j 依赖解决了问题。

如下图:

xml 复制代码
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
    <exclusions>
        <exclusion>
            <artifactId>log4j-over-slf4j</artifactId>
            <groupId>org.slf4j</groupId>
        </exclusion>
    </exclusions>
</dependency>

虽然解决了这个StackOverflowError,但是原有的报错仍然没有解决,只能继续在排查bug中遨游。

最终解决方案

这个时候我关注到了这个报错信息。

js 复制代码
### The error occurred while setting parameters
### SQL: select PXID,CERTID,CERTTYPE,SOURCE,STARTDATE,ENDDATE,STATUS,SUBSCRIBETYPE,CREATETIME, UPDATETIME  
from  table
where SUBSCRIBETYPE = ? and CERTID =? and CERTTYPE = ?

在一开始我是完全忽略这个问题的,毕竟我的列名一开始可是对着数据库一个一个敲的,不可能写错啊。

打脸的来了,SOURCE字段在建表语句中,没有写入。事实上,我是参考其他数据库写下这个建表语句。

一天排查bug搞得头昏脑涨,心力交瘁的,最后得到一个教训:

不要相信自己的手敲,一定要copy才最保险。

相关推荐
Chen-Edward3 小时前
有了Spring为什么还有要Spring Boot?
java·spring boot·spring
陈小桔4 小时前
idea中重新加载所有maven项目失败,但maven compile成功
java·maven
小学鸡!4 小时前
Spring Boot实现日志链路追踪
java·spring boot·后端
xiaogg36784 小时前
阿里云k8s1.33部署yaml和dockerfile配置文件
java·linux·kubernetes
逆光的July4 小时前
Hikari连接池
java
微风粼粼4 小时前
eclipse 导入javaweb项目,以及配置教程(傻瓜式教学)
java·ide·eclipse
番茄Salad5 小时前
Spring Boot临时解决循环依赖注入问题
java·spring boot·spring cloud
天若有情6735 小时前
Spring MVC文件上传与下载全面详解:从原理到实战
java·spring·mvc·springmvc·javaee·multipart
祈祷苍天赐我java之术5 小时前
Redis 数据类型与使用场景
java·开发语言·前端·redis·分布式·spring·bootstrap
Olrookie6 小时前
若依前后端分离版学习笔记(二十)——实现滑块验证码(vue3)
java·前端·笔记·后端·学习·vue·ruoyi