分析过程可以直接跳过,直接看解决方法
在只引入了一个xml目录时,程序运行正常,各个Mapper方法也可以正常调用,后续其它开发同志引入了其他包中的xml目录,导致调用Mapper的所有方法都报错,最后没找到原因也没解决,然后交给了我解决。
版本信息:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.1</version><relativePath/>
</parent><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version>
</dependency>
yml中原mybatis配置:
mybatis:mapper-locations: classpath*:/mapper/**/*.xml
引入其它包后的配置:
mybatis:mapper-locations: classpath*:/mapper/**/*.xml, classpath*:/xmls/**/*.xml
mybatis-plus配置类:
@Configuration
public class MybatisPlusConfig {@Value("${mybatis-plus.mapper-locations}")private String mapperLocations;@Beanpublic SqlSessionFactory sqlSessionFactory(DataSource dataSource)throws Exception {final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();sessionFactory.setDataSource(dataSource);sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));// 设置公共字段的拦截GlobalConfig globalConfig = GlobalConfigUtils.defaults();sessionFactory.setGlobalConfig(globalConfig);Object();}
}
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): apper.health.HealthRecordsMapper.selectRecordsat org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:235) ~[mybatis-3.5.10.jar:3.5.10]at verride.MybatisMapperMethod.<init>(MybatisMapperMethod.java:50) ~[mybatis-plus-core-3.5.2.jar:3.5.2]at verride.MybatisMapperProxy.lambda$cachedInvoker$0(MybatisMapperProxy.java:111) ~[mybatis-plus-core-3.5.2.jar:3.5.2]at urrent.ConcurrentHashMapputeIfAbsent(ConcurrentHashMap.java:1660) ~[?:1.8.0_171]at lkit.CollectionUtilsputeIfAbsent(CollectionUtils.java:115) ~[mybatis-plus-core-3.5.2.jar:3.5.2]at verride.MybatisMapperProxy.cachedInvoker(MybatisMapperProxy.java:98) ~[mybatis-plus-core-3.5.2.jar:3.5.2]at verride.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.5.2.jar:3.5.2]at com.sun.proxy.$Proxy136.selectRecordByIdCardNumber(Unknown Source) ~[?:?]……
mybatis:mapper-locations: classpath*:/mapper/**/*.xml, classpath*:/xmls/**/*.xml
<resources><resource><directory>src/main/resources</directory><includes><include>**/*.yml</include><include>**/*.xml</include><include>**/*.properties</include></includes><filtering>true</filtering></resource>
</resources>
随后查看jar包中也有mapper和xmls对应的jar包和他们的xml文件。
到这里其实就很疑惑,之前从来没碰到过这种问题,网上搜索一番后也没什么新发现。
没法只能打断点看看哪里出了问题,最后发现是MybatisPlusConfig配置类扫描资源的问题:
new PathMatchingResourcePatternResolver().getResources(mapperLocations)这个类扫描xml资源的时候,一条资源也没返回。这下找到原因了,最后点进源码查看,才发现这一个版本资源扫描根本就没有处理多资源的情况!!!!
根目录只识别了mapper这个文件夹,文件的匹配模式直接就截取了根目录后面的所有内容:
**/*.xml,classpath*:/xmls/**/*.xml
这下找到原因就好办了,进入解决问题模式。
手动加载多个xml资源
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource)throws Exception {final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();sessionFactory.setDataSource(dataSource);// 多mapper地址手动加载PathMatchingResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();String[] split = mapperLocations.split(",");Resource[] resources = Resources(split[0]);Resource[] resources1 = Resources(split[1]);// 合并两个mapper资源sessionFactory.setMapperLocations(ArrayUtil.addAll(resources, resources1));// 设置公共字段的拦截GlobalConfig globalConfig = GlobalConfigUtils.defaults();sessionFactory.setGlobalConfig(globalConfig);Object();
}
本文发布于:2024-02-03 08:16:57,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170691941949787.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |