今天在将Mybatis框架集成进Spring框架后,做DAO层单元测试时,发现报如下错误:
org.apache.ibatis.binding.BindingException:Invalid bound statement (not found):xxx.xxx.xxx.xxx.Dao接口类
这类问题常规解决思路,要不就是写XML的时候,“namespace”属性值对应的类路径拼写错误,或者接口类中定义的方法名和XML文件中定义的ID属性不一致。
但让人懊恼的是,检查了3~4遍,运行单元测试,继续报这个错误。什么鬼???
没办法,求助度娘,基本解决的思路和之前自己想的大同小异。还有些同学的答案是在XML文件里打几个空格、换个行云云。死马当活马医,试试吧,希望出现奇迹,但可惜没有。
这里补充下我项目结构,如下:
src/main/java/自定义包路径/mapper/xxxxxMapper.java|xxxxxMapper.xml
src/main/resources/相关配置文件等
怎么继续?突然想到查看下maven编译出来的classes文件,按目录一查,居然发现xxxxxMapper.xml文件没有出现在编译后的class类路径,也就是“自定义包路径/mapper”的下面。难道问题在这,继续试试吧。
既然作为资源文件的XML文件没有编译出来,那就给他挪挪窝,于是在resources文件下建目录mapper,然后将xxxxxMapper.xml文件放到此目录下。同时在配置文件添加属性,如下:
继续单元测试,这次OK,顺利通过。
原来所有问题的原因就是maven在打包的时候,没有将在classpath路径下的资源文件打包到war包或者jar包导致,所以解决方法也就应运而生。
或者也可以通过如下方法,通过在pom文件中声明资源的方式,可将在classpath下的资源文件打包进war包或者jar包,如下:
今天这个问题,归纳起来就是,先检查Mybatis配置文件的时候,类路径或者接口方法对应ID是否出错;如果这样找不到问题,那就要看看你所包含在项目里的资源文件是否在maven打包的时候打包进项目中,通过以上查找,这个问题应该基本可以避免。
PS:接下去有空,上来补充一篇关于项目中资源文件查找路径的文章,欢迎关注!