2025-03-21 01:17:05.635 WARN 24424 --- [ main] o.mybatis.spring.SqlSessionFactoryBean : Property 'mapperLocations' was specified but matching resources are not found.
时间: 2025-03-21 21:00:26 浏览: 85
### 解决 MyBatis SqlSessionFactoryBean `mapperLocations` 属性未找到匹配资源的问题
当配置 MyBatis 的 `SqlSessionFactoryBean` 时,如果指定的 `mapperLocations` 路径不正确或者无法解析到实际存在的 Mapper 文件,则会抛出类似于 “no matching resources found” 的错误提示。这通常是因为路径设置有误、文件命名不符合约定或项目打包结构问题。
以下是可能的原因分析以及解决方案:
#### 可能原因及解决方法
1. **Mapper XML 文件位置不对**
如果 Mapper XML 文件不在类路径下的预期目录中,Spring 将无法定位这些文件。默认情况下,MyBatis 配置中的 `mapperLocations` 使用的是 Spring Resource Pattern Syntax 来定义路径[^1]。
- 确保 Mapper XML 文件位于项目的 `resources` 目录下,并按照包名分层存储。例如,假设有一个名为 `com.example.mapper.UserMapper.xml` 的文件,那么它应该存放在 `src/main/resources/com/example/mapper/UserMapper.xml` 下。
- 修改 `mapperLocations` 的值为对应的路径模式。例如:
```properties
mybatis.mapper-locations=classpath*:com/example/mapper/*.xml
```
2. **XML 文件名称与接口名称不一致**
当使用基于注解的方式绑定 Mapper 接口和 XML 文件时,要求 XML 文件的名字必须与接口名字完全相同(大小写敏感)。如果不一致,即使路径正确也可能找不到映射关系[^2]。
- 检查所有的 Mapper 接口及其对应的 XML 文件是否遵循这一规则。比如对于 `UserMapper.java` 接口,其关联的 XML 应命名为 `UserMapper.xml`。
3. **JNDI 名称转换失败影响上下文初始化**
错误日志提到 JNDI 查找失败的情况表明可能存在某些依赖注入未能成功完成的现象。虽然这不是直接导致 `mapperLocations` 失效的因素,但它暗示着整个应用上下文中存在其他潜在问题,这些问题可能会间接干扰到 MyBatis 的正常工作流程。
- 审核应用程序的整体配置,特别是那些涉及外部资源配置的部分,确保所有必要的组件都能够被正确定位并实例化。
4. **动态刷新机制缺失引起开发期不便**
开发阶段频繁更改 SQL 映射语句而不得不反复重启服务器确实令人沮丧。为了提高效率可以考虑引入一些插件支持实时编译功能。
- 对于 Maven 工程来说,可以通过添加如下插件实现自动重新加载效果:
```xml
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
```
- 同时也可以借助工具如 JRebel 或者 DevTools 提升体验度。
```java
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sessionFactory.setMapperLocations(resolver.getResources("classpath*:mappers/**/*.xml"));
return sessionFactory.getObject();
}
```
以上代码片段展示了如何通过编程方式设定多个不同子目录内的 Mapper 文件作为扫描目标之一。
---
阅读全文
相关推荐



















