org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [org/mybatis/spring/boot/autoconfigure/MybatisAutoConfiguration.class]: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactory' threw exception with message: class path resource [Mapper/*.xml] cannot be opened because it does not exist at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:657) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:645) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1361) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1191) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:346) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) ~[spring-beans-6.2.3.jar:6.2.3] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-6.2.3.jar:
时间: 2025-06-15 22:08:53 浏览: 6
<think>好的,我现在需要解决用户在Spring Boot应用中遇到的SqlSessionFactory创建失败的问题,特别是因为Mapper XML文件找不到的情况。首先,我得回想一下常见的导致这个问题的原因。根据用户提供的引用内容,可能的问题点包括配置路径不正确、Mapper接口和XML文件不在同一路径下,或者MyBatis的配置没有正确指定XML的位置。
首先,用户可能没有正确配置MyBatis的mapperLocations属性。在Spring Boot中,通常会在application.properties里设置mybatis.mapper-locations,但有时候路径可能写得不正确。例如,引用5中提到,路径可能需要调整为classpath:mapper/**/*.xml来扫描多个子目录中的XML文件。如果用户原来的路径是classpath:mapper/*.xml,那么当XML文件分布在子文件夹下时,就无法被扫描到,导致SqlSessionFactory创建失败。
其次,引用1和4提到,如果Mapper接口和XML文件不在同一路径下,需要手动指定XML的位置。这可能涉及到在配置类中使用@Bean来定义SqlSessionFactoryBean,并设置mapperLocations属性。用户可能没有正确配置这个Bean,或者在设置路径时使用了错误的通配符。
另外,引用3提到的依赖问题也可能导致问题。如果缺少mybatis-spring-boot-starter或者数据库驱动如mysql-connector-java,项目可能无法正确初始化MyBatis的相关组件,包括SqlSessionFactory。需要检查pom.xml或build.gradle文件,确保这些依赖存在且版本兼容。
还有,文件的位置是否正确也很重要。根据标准的Maven/Gradle项目结构,资源文件如XML应该放在src/main/resources下的相应目录中。如果用户将XML文件放错了位置,比如放在了src/main/java下,那么编译后这些文件可能不会被包含到classpath中,导致找不到。
最后,可能需要检查MyBatis的配置文件,如configLocation是否指向了正确的配置文件,并且在该配置文件中是否正确定义了mappers。不过,在Spring Boot中通常更推荐使用application.properties或YAML文件来配置,而不是传统的MyBatis XML配置文件。
总结下来,可能的解决步骤包括:检查依赖、确认XML文件路径配置、验证文件位置是否正确,以及必要时手动配置SqlSessionFactoryBean。需要一步步引导用户检查这些方面,确保每个配置项都正确无误。</think>### 逐步解决方案:Spring Boot应用中SqlSessionFactory创建失败(Mapper XML文件未找到)
#### 1. **检查依赖配置**
确保项目中包含必要的MyBatis和数据库驱动依赖。若使用Maven,在`pom.xml`中添加以下依赖:
```xml
<!-- MyBatis Spring Boot Starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
```
如果依赖版本不兼容或缺失,会导致组件初始化失败[^3]。
---
#### 2. **配置Mapper XML文件路径**
在`application.properties`中明确指定Mapper XML文件的路径。例如:
```properties
# 扫描多个目录或子目录中的XML文件
mybatis.mapper-locations=classpath:mapper/**/*.xml
```
- **通配符说明**:
- `classpath:mapper/*.xml`:仅扫描`resources/mapper`目录下的XML文件。
- `classpath:mapper/**/*.xml`:递归扫描`resources/mapper`及其子目录下的所有XML文件[^5]。
---
#### 3. **验证文件位置**
确保Mapper XML文件位于`src/main/resources`目录下,例如:
```
src/main/resources/
├─ mapper/
│ ├─ user/
│ │ └─ UserMapper.xml
│ └─ order/
│ └─ OrderMapper.xml
```
编译后文件应位于`target/classes/mapper`目录中。若文件未正确复制到classpath,需检查构建配置(如Maven的`<resources>`配置)[^5]。
---
#### 4. **手动配置SqlSessionFactory(可选)**
若自动配置不生效,可手动定义`SqlSessionFactoryBean`:
```java
@Configuration
public class MyBatisConfig {
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath:mapper/**/*.xml"));
return factoryBean.getObject();
}
}
```
此方式直接指定XML文件路径,避免路径解析问题[^1][^4]。
---
#### 5. **检查Mapper接口与XML命名一致性**
确保Mapper接口(如`UserMapper.java`)和XML文件(如`UserMapper.xml`)满足以下条件:
- **同名**:接口名与XML文件名一致(例如`UserMapper`)。
- **同包**:接口位于`com.example.mapper`包,XML应位于`resources/com/example/mapper`目录(或通过`mybatis.mapper-locations`配置匹配路径)[^1]。
---
#### 6. **查看日志定位问题**
启动应用时,关注控制台日志中是否有以下关键信息:
- `BindingException: Invalid bound statement (not found)`:表明XML未正确加载。
- `NoSuchBeanDefinitionException: SqlSessionFactory`:依赖或配置错误。
根据日志提示调整配置路径或依赖版本。
---
### 相关问题
1. **如何验证MyBatis的Mapper XML文件是否被加载?**
答:启动时查看日志中是否输出`Parsed mapper file: [file_path]`,或通过`SqlSession`手动执行SQL测试。
2. **Spring Boot中如何整合多个数据源并配置SqlSessionFactory?**
答:需为每个数据源单独配置`SqlSessionFactory`和`@Primary`注解,避免Bean冲突。
3. **MyBatis XML文件中占位符不生效的可能原因?**
答:检查是否启用`mybatis.configuration.map-underscore-to-camel-case`,或是否漏写`${}`/`#{}`语法[^2]。
阅读全文
相关推荐













