背景
今天,大王我来巡日志,发现出现下面错误
data access exception, errorMsg:nested exception is org.apache.ibatis.binding.BindingException: Parameter 'param1' not found. Available parameters are [et]
很明显,是一个mybatis在处理sql时需要使用参数却没找,并且温馨的提示了可用参数只有[et]
。
问题追溯
-
复现操作,产生同样的错误信息
-
定位问题
因为这行代码
该org.apache.ibatis.binding.MapperMethod.ParamMap
类重写了get方法,如果参数不存在就会抛出绑定异常。
-
思考问题
原本,此处的逻辑仅仅只是为了打印更新前的参数信息,以便排查数据更新相关的问题。
但我错误的认为,所有的参数名都用了mybatis默认生成的参数别名,导致在使用mybatis plus的批量更新方法时出现报错。
因为mybatis plus的批量更新方法是使用了别名参数处理的。
-
解决问题
问题排查清楚后,就很简单
不调用get
方法,直接打印参数即可。 -
推广
类似Mybatis抛出某某参数找不到,大致原因就是在获取参数时找不到对应的参数,被ParamMap
的get方法抛出了异常。
反思
- 不了解调用方法的底层实现。
- 项目自动化测试不到位,虽然相关逻辑确实在比较深的位置,但主要业务方法都没覆盖全。
- 对于aop,其他3方组件添加自己的逻辑,最好封在异常捕获结构中,避免因自身原因导致逻辑中断。