: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/epf/nrt/admin/config/mybatisplus/MyBatisConfig.class]: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'createSqlSessionFactoryBean' threw exception with message: org/springframework/core/NestedIOException
时间: 2025-05-21 22:30:36 浏览: 18
### 关于Spring Boot项目中SqlSessionFactory创建失败的问题
当遇到 `org.springframework.core.NestedIOException` 和 `org.springframework.beans.factory.UnsatisfiedDependencyException` 的错误时,通常表明 MyBatis 或 MyBatis Plus 的配置存在问题。以下是可能导致该问题的原因及其解决方案:
#### 1. **MyBatis Plus依赖冲突**
如果项目的 `pom.xml` 文件中同时引入了 MyBatis 和 MyBatis Plus 的依赖,则可能会导致依赖冲突,从而引发 `NestedIOException` 或其他类似的异常[^2]。
```xml
<!-- 正确的MyBatis Plus依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<!-- 不建议再额外引入以下依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
```
应仅保留 MyBatis Plus 的官方启动器依赖,并移除多余的 MyBatis 启动器依赖。
---
#### 2. **Mapper接口未被扫描**
如果 Mapper 接口所在的包路径未被正确扫描到,Spring 将无法实例化对应的 Bean,进而抛出 `UnsatisfiedDependencyException` 异常[^3]。
确保在 Spring Boot 应用程序入口类上添加如下注解:
```java
@SpringBootApplication
@MapperScan("com.example.mapper") // 替换为实际的Mapper接口所在包路径
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
```
或者,在每个 Mapper 接口中显式声明其为组件:
```java
@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {}
```
---
#### 3. **数据源配置缺失或错误**
`SqlSessionFactory` 创建失败也可能由于数据源配置不完整或有误引起。需确认 `application.yml` 或 `application.properties` 中的数据源配置是否正确。
示例 YAML 配置文件:
```yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: root
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
```
如果没有正确设置数据库连接参数,可能触发 `NestedIOException` 异常。
---
#### 4. **MyBatis Config 类中的Bean定义问题**
如果自定义了一个 MyBatis 配置类 (如 `MyBatisConfig`) 并在此类中手动注册了 `SqlSessionFactory`,则需要特别注意其实现逻辑是否有误。
示例配置类:
```java
@Configuration
public class MyBatisConfig {
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
factoryBean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
return factoryBean.getObject();
}
}
```
此部分代码必须与项目结构一致,尤其是 `setMapperLocations()` 方法指定的 XML 映射文件路径。
---
#### 5. **版本兼容性问题**
某些情况下,使用的 MyBatis Plus 版本与其所依赖的 Spring Boot 版本可能存在不兼容的情况。推荐检查并升级至最新稳定版组合。
例如:
- MyBatis Plus 3.4.0 对应支持 Spring Boot 2.x 系列。
- 如果使用的是更高版本的 Spring Boot,则考虑更新 MyBatis Plus 至更近的版本。
---
### 总结
通过排查以上几个方面——依赖冲突、Mapper 扫描范围、数据源配置以及自定义配置类实现细节,可以有效定位并解决 `SqlSessionFactory` 创建失败的问题。若仍未能解决问题,请提供完整的堆栈日志以便进一步分析。
阅读全文
相关推荐









