SpringBoot Maven多模块项目 mapper.xml 文件扫描不到问题
项目使用的是SpringBoot + Mybatis Plus,maven多模块项目,其中有多个模块的resource下面有Mapper.xml文件。这点是问题的前提,在配置文件里面也指定了mybatis-plus的xml位置:mybatis-plus:# mapper xml映射路径mapper-locations: classpath*:mapper/**/*Mapper.xml之前是走的单独
项目使用的是SpringBoot + Mybatis Plus,maven多模块项目,其中有多个模块的resource下面有Mapper.xml文件。这点是问题的前提,
在配置文件里面也指定了mybatis-plus的xml位置:
mybatis-plus:
# mapper xml映射路径
mapper-locations: classpath*:mapper/**/*Mapper.xml
之前是走的单独的库,也就是走的Mybatis Plus默认的 SqlSessionFactory ,项目是正常的。
但是把项目改为多数据源后,由于在配置文件里面手动创建了 SqlSessionFactory 的 Bean 后,导致调用mybatis-plus自带的方法的时候,是好使的,调用自己手动写的xml方法的时候,就提示参数绑定问题:org.apache.ibatis.binding.BindingException
Invalid bound statement (not found): ************
由于改动只是新增了配置多数据源的配置文件,其中有个配置文件中定义了一个名为 SqlSessionFactory 的 Bean:
/**
* 使用MyBatis Plus的sqlSessionFactory代替,
* 此处注意mybatis与mybatisPlus的配置不同,不然扫描不到对数据操作的方法。会报未绑定错误
* @return sqlSessionFactory
* @throws Exception
*/
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(myRoutingDataSource);
// sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/**/*.xml"));
org.springframework.core.io.Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath:mapper/**/*.xml");
sqlSessionFactoryBean.setMapperLocations(resources);
MybatisConfiguration mybatisConfiguration = new MybatisConfiguration();
sqlSessionFactoryBean.setConfiguration(mybatisConfiguration);
return sqlSessionFactoryBean.getObject();
}
可以看到代码里面指定了扫描的位置为:classpath:mapper/**/*.xml,乍一看,也没毛病。其实就是mybatis用的多了,而mybatis-plus这样配置就可能不太行。
把这个报错信息在网上一搜,大多都是说要么是Mapper.xml文件里面映射的Mapper接口的路径有问题,要么是没有在配置文件里面指定mapper文件的扫描位置,对比之后,发现我的问题并不是因为这个,但是因为什么,就不知道了。
折腾了半天之后,无果。。。。。。。。。
其中发现一个比较神奇的问题是,由于项目有多个maven子模块里面包含mapper.xml文件,其中有一个模块下面的xml文件是可以扫描到的,可以正常查询,另外两个子模块的都报上面的参数绑定异常。
就很诡异,想着是不是maven项目配置问题,导致的,然后仔细对比能扫描到的那个子模块的pom文件,发现里面定义了打包相关的代码。
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
上面代码为maven项目打包时,是否想resource下面的文件打包到项目包里面,无论是打包成jar还是打包成war。
其中 filtering 的属性,表示打包时是否动态替换配置文件里面的内容。如果没有动态配置的内容,这里设置true和false都不影响。但是必须得有,否则上面即使配置了扫描路径为 classpath*:mapper/**/*.xml 也是扫描不到xml文件的。
然后就把另外两个有问题的字母块的pom文件里面加上这个。发现还是不行。
然后想着会不会是扫描到了,但是扫描了多次,后面的扫描结果把前面的扫描结果给覆盖了呢?
于是在上面的代码
sqlSessionFactoryBean.setMapperLocations(resources);
打了个断点,看了下 resources,启动的时候,发现只走了一次扫描的过程,扫描结果为正常的子模块下面的xml文件。。。。。。。
然后试着注释掉这个子模块,发现可以扫描到另一个之前扫描不到的子模块下的xml文件了。。。。。。
然后就开始搜maven多模块,扫描多个mapper文件位置,发现有classpath*:mapper/**/*.xml 这种写法,然后试了下,果然能识别到两个子模块下的mapper文件了,接着把另一个子模块的pom文件里面也指定build,接着就完全好使了。。。。。。。
就这一个星号的问题,导致折腾了大半天了。。。。。。
另外,看到一篇博客里面提到关于扫描mapper配置文件位置,mybatis-plus 3.1.2 版本后,里面已经设置默认扫描位置为:classpath*:mapper/**/*.xml,见配置文件:MybatisPlusProperties
而mybatis源码MybatisProperties里面貌似没有,所以还是需要手动声明扫描位置:
mybatis:
mapper-locations: mapper/*.xml
转载于:https://blog.csdn.net/linmengmeng_1314/article/details/122083861
更多推荐
所有评论(0)