记一次mybatis bindingexception 问题排查

看到的错误信息如出一辙都是这样的:Method threw ‘org.apache.ibatis.binding.BindingException‘ exception.Invalid bound statement (not found): **.dao.**Dao.select

1.考虑返回值类型是否不匹配,一顿修改,@Results 也使用到。 最终无果。

2.开始各种百度,先申明本人使用的方式注解方式, 并非最常用的xml方式。 百度内容大都雷同,检查包名,类名,方法名 是否映射。无果。

3.由于 mybatis 报的错误,不是很明确。 无奈只能debug 源码。

4. 查看更为详细的异常日志

 1 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.sankuai.meituan.banma.thrift.activity.admin.dao.CouponPossessDao.selectUnusedPageNum
 2     at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:214) ~[mybatis-3.4.0.jar:3.4.0]
 3     at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:48) ~[mybatis-3.4.0.jar:3.4.0]
 4     at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:59) ~[mybatis-3.4.0.jar:3.4.0]
 5     at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:52) ~[mybatis-3.4.0.jar:3.4.0]
 6     at com.sun.proxy.$Proxy96.selectUnusedPageNum(Unknown Source) ~[na:na]
 7     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_131]
 8     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_131]
 9     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_131]
10     at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_131]
11     at com.dianping.zebra.dao.AsyncMapperProxy.invoke(AsyncMapperProxy.java:64) ~[zebra-dao-0.2.4.jar:na]
12     at com.sun.proxy.$Proxy96.selectUnusedPageNum(Unknown Source) ~[na:na]

第二行是重点。点击查看代码。

 1  public SqlCommand(Configuration configuration, Class<?> mapperInterface, Method method) {
 2             String statementName = mapperInterface.getName() + "." + method.getName();
 3             MappedStatement ms = null;
 4             if(configuration.hasStatement(statementName)) { //正常的逻辑都会进入该 if 逻辑,然后得到ms。 该方法未进入该逻辑。不到是该方法初始化时,就失败了。
 5                 ms = configuration.getMappedStatement(statementName);
 6             } else if(!mapperInterface.equals(method.getDeclaringClass())) {
 7                 String parentStatementName = method.getDeclaringClass().getName() + "." + method.getName();
 8                 if(configuration.hasStatement(parentStatementName)) {
 9                     ms = configuration.getMappedStatement(parentStatementName);
10                 }
11             }
12
13             if(ms == null) {
14                 if(method.getAnnotation(Flush.class) == null) {
15                     throw new BindingException("Invalid bound statement (not found): " + statementName); //该行即为抛出的异常日志
16                 }
17
18                 this.name = null;
19                 this.type = SqlCommandType.FLUSH;
20             } else {
21                 this.name = ms.getId();
22                 this.type = ms.getSqlCommandType();
23                 if(this.type == SqlCommandType.UNKNOWN) {
24                     throw new BindingException("Unknown execution method for: " + this.name);
25                 }
26             }
27
28         }

下面开始追踪初始化的代码块。

 1 public class ZebraMapperFactoryBean<T> extends SqlSessionDaoSupport implements FactoryBean<T> {
 2     private Class<T> mapperInterface;
 3     private boolean addToConfig = true;
 4
 5     public ZebraMapperFactoryBean() {
 6     }
 7
 8     public void setMapperInterface(Class<T> mapperInterface) {
 9         this.mapperInterface = mapperInterface;
10     }
11
12     public void setAddToConfig(boolean addToConfig) {
13         this.addToConfig = addToConfig;
14     }
15
16     protected void checkDaoConfig() {
17         super.checkDaoConfig();
18         Assert.notNull(this.mapperInterface, "Property ‘mapperInterface‘ is required");
19         Configuration configuration = this.getSqlSession().getConfiguration();
20         if(this.addToConfig && !configuration.hasMapper(this.mapperInterface)) {
21             try {
22                 configuration.addMapper(this.mapperInterface);//下面跟进该方法查询具体的报错行
23             } catch (Throwable var6) {
24                 this.logger.error("Error while adding the mapper ‘" + this.mapperInterface + "‘ to configuration.", var6); // 初始化时,执行到这里其实已经报错了。但是没影响启动
25                 throw new IllegalArgumentException(var6);
26             } finally {
27                 ErrorContext.instance().reset();
28             }
29         }
30
31     }

public class MapperAnnotationBuilder {

private SqlSource getSqlSourceFromAnnotations(Method method, Class<?> parameterType, LanguageDriver languageDriver) {        try {            Class<? extends Annotation> sqlAnnotationType = this.getSqlAnnotationType(method);            Class<? extends Annotation> sqlProviderAnnotationType = this.getSqlProviderAnnotationType(method);            Annotation sqlProviderAnnotation;            if(sqlAnnotationType != null) {                if(sqlProviderAnnotationType != null) {                    throw new BindingException("You cannot supply both a static SQL and SqlProvider to method named " + method.getName());                } else {                    sqlProviderAnnotation = method.getAnnotation(sqlAnnotationType);                    String[] strings = (String[])((String[])sqlProviderAnnotation.getClass().getMethod("value", new Class[0]).invoke(sqlProviderAnnotation, new Object[0]));                    return this.buildSqlSourceFromStrings(strings, parameterType, languageDriver);                }            } else if(sqlProviderAnnotationType != null) {                sqlProviderAnnotation = method.getAnnotation(sqlProviderAnnotationType);                return new ProviderSqlSource(this.assistant.getConfiguration(), sqlProviderAnnotation);            } else {                return null;            }        } catch (Exception var8) {            throw new BuilderException("Could not find value method on SQL annotation.  Cause: " + var8, var8); //最初的报错的位置        }    }

这里就可以找到具体的初始化失败的方法了。

5.至此找到了,正确的解决方案。

6.由此得出几个结论。1.mybatis 报警的确是很不明确。  2.出现问题,优先还是优先考虑排除法。一段代码一段代码检查。

原文地址:https://www.cnblogs.com/qunan/p/8330780.html

时间: 2024-10-09 00:46:40

记一次mybatis bindingexception 问题排查的相关文章

记一笔MyBatis的坑

记一笔MyBatis的坑 1.sql查询concat()连接函数xml运行查询乱码 1 select concat(CONVERT(round(count(case when sq.LOANOVERDUE = 'Y' then 1 else null end) / count(1) * 100, 2), char)'%') bll 2 FROM fact_dkxx sq 由于连接的字符串中包含数字与百分比字符串,数据类型不一致,在xml中查询返回内容乱码,因此需要将数字使用CONVERT(num

记一次死锁问题的排查和解决

说起来这个事情还是挺悲催的,记得上周忙的不亦乐乎,目标是修改之前另外一个团队留下来的一坨代码中的一些bug,这个项目是做OLAP分析的,分为两个模块,逻辑服务器主要负责一些元数据的操作,例如页面上展示的一些信息,而分析服务器负责执行查询语句,因为他们之前使用的是mondrian作为OLAP分析引擎,所以输入的查询是MDX语句,然后结果是一个二维的数据.这是基本的项目背景,当然使用mondrian的过程中发现他的确够慢的. 而且mondrian还有一个问题,它的确在内部实现了一些缓存,缓存好像是基

记一次window服务器木马排查(后门植入挖矿程序)

1,新项目需要一台windows服务器,安装所需环境和服务后,发现服务器资源不足无法运行,查看任务管理器,发现可疑程序占满了CPU 通过百度发现,这个一个挖矿程序,显然是被后门植入了矿机,果断杀掉进程,删掉文件 第二天,发现CPU又被挖矿沾满,经过分析,这个后门程序,和系统的svchost.exe很像,删除过后一直自动新建出来. 通过一个一个的排查进程,发现一个可疑进程,和程序,经过仔细的对比了解,可疑判断这是一个后门木马 由于服务器跑的服务比较多,不能开防火墙,只能选择第三方防护软件,综合对比

记crond导致备份失败的排查过程

今天上班的路上收到一条短信,显示线上所有实例备份都失败了.备份失败是大事,于是到公司的第一件事儿就是排查备份失败的原因. 这两天迁移了数据库管理平台,当然涉及到数据库备份功能,备份失败肯定和平台迁移有一定关系,我们先聊聊线上备份方案: 目前线上的备份方案是: 1.有一个前端页面可以配置备份任务 2.备份任务配置好了,会自动刷新到系统的crontab定时通过ansible远程执行. 排查过程: 1.查看备份报告,显示所有的备份文件大小都是0,初步估计是备份失败了而不是元数据没有更新的问题. 2.去

记一次JVM Metaspace溢出排查

多图预警! 环境:系统测试(Windows Server/JRE8/tomcat7) 现象:应用运行几天后,出现访问超时,服务器cpu利用率居高不下 问题日志:OutOfMemoryError:MetaSpace 问题分析: 原因分析:MetaSpace是jvm存放类信息的内存空间,发生溢出的可能原因: metaSpace设置过小,不足应用所需 应用metaSpace持续增长,超过metaSpace限制 定位:问题最先从DeviceStatusMonitorTask中报出,而这个定时任务新版本修

记某校园无线网络故障排查

[问题描述]:某高校无线网络发射两个信号,一个为TEACHER,另一个为STUDENT,节前部署试运行阶段一切正常,节后学生返校开学,就开始有部分学生反映连接STUDENT信号不能上网,具体表现为,无线信号能连接上,但是无线终端(包括手机和笔记本)获取不到地址,直接分配169.254.175.149:而连接TEACHER信号的则一切正常.[问题排查]: 1.综合这几天故障申报的时间观察来看, 没有固定的时间段,基本上全天都会有几率出现故障现象:       2.排查TEACHER和STUDENT

记一次mybatis&lt;if&gt;标签的问题

前言 到底还是没理解清楚的锅~~~~搞了好久...啊啊啊啊 错误: There is no getter for property named 'name' in 'class java.lang.Long' org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property

记spring-boot项目启动卡住问题排查记录

问题背景 一个spring boot开发的项目,spring boot版本是1.5.7,携带的spring版本是4.1.3.开发反馈,突然在本地启动不起来了,表象特征就是在本地IDEA上运行时,进程卡住也不退出,应用启动时加载相关组件的日志也不输出.症状如下图: 问题分析 因为没有有用的日志信息,所以不能从日志这个层面上排查问题.但是像这种没有输出日志的话,一般情况下,肯定是程序内部启动流程卡在什么地方了,只能通过打印下当前线程堆栈信息了解下.一般情况下,在服务器环境,我们会使用java工具包中

Kafka 异步消息也会阻塞?记一次 Dubbo 频繁超时排查过程

线上某服务 A 调用服务 B 接口完成一次交易,一次晚上的生产变更之后,系统监控发现服务 B 接口频繁超时,后续甚至返回线程池耗尽错误 Thread pool is EXHAUSTED.因为服务 B 依赖外部接口,刚开始误以为外部接口延时导致,所以临时增加服务 B dubbo 线程池线程数量.配置变更之后,重启服务,服务恢复正常.一段时间之后,服务 B 再次返回线程池耗尽错误.这次深入排查问题之后,才发现 Kafka 异步发送消息阻塞了 dubbo 线程,从而导致调用超时. 一.问题分析 Dub