背景:以往开发都是单体项目集群部署,项目是垂直结构的,所有需要的配置文件、资料的加载都是直接通过yml或者parpreties文件直接声明加载路径的,随着业务范围的扩大,领导要求把项目改成水平结构的,以此提供给用户更多的选择范围,同时也使项目变得更加容易维护,并在一定程度上提升项目的性能。
问题:我这边是把项目拆成了九个模块(这是在忽略消费者模块的情况下)(六个应用、一个配置、一个静态资源、一个api调用),采用dubbo+zk的形式分布式开发项目,这样我这边就能根据用户的需要只部署对应的应用模块即可。结构如下(部分消费者模块未加入)
由于项目中使用了shiro,并且在大量的模块中都存在权限管理,因此考虑把shiro从各个应用模块中抽取出来,放在config模块中,所有的应用模块都将config模块引入,而shiro在认证和授权的过程中需要调用数据库。这样就出现了一个问题:config模块需要引入mapper配置,而其他应用模块也需要引入mapper,而config模块作为配置模块,本身不能够扫描xml文件,既然无法扫描xml文件,那也就无法与mapper接口进行匹配。如果将shiro需要的mapper层接口放在应用模块,那么就需要在config模块引用对应的应用模块,势必会造成循环依赖。
解决方案:这种问题其实都是属于初级问题,我这边首先检查了以下三点。
1、接口与xml文件名是否一致
2、xml文件对应的namespace是否与接口路径一致
3、注解@MapperScan是否扫描到了接口层,或者接口是否添加了@Mapper注解(注意这个注解对应的包)
4、xml文件是否被加载到
这边问题主要就是出在第四点上了,由于config模块本身不会扫描xml文件,所以加载xml文件的工作在应用模块,因此应用模块在加载xml路径时要把本模块以及配置模块的xml文件全部扫描加载。
下面做个示例
mybatis: mapper-locations: classpath:mapper/*Mapper.xml,classpath*:/mapper/*.xml type-aliases-package: com.example.demo.entity
注意:其他模块的mapper文件夹前面需要加/,因为他并不是和本项目同级。


![MyBatis:[Invalid bound statement (not found)],接口找不到对应的执行语句 MyBatis:[Invalid bound statement (not found)],接口找不到对应的执行语句](http://www.mshxw.com/aiimages/31/732014.png)
