DataSourceAutoConfiguration去掉后就Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
时间: 2025-07-18 17:00:37 浏览: 4
<think>我们正在解决的是在移除DataSourceAutoConfiguration后出现的sqlSessionFactory或sqlSessionTemplate缺失异常。
原因分析:当我们排除了Spring Boot的默认数据源自动配置(DataSourceAutoConfiguration)时,与之相关的MyBatis自动配置(如MybatisAutoConfiguration)也会因为缺少必要的Bean(如DataSource)而无法自动配置,从而导致sqlSessionFactory和sqlSessionTemplate无法被创建。
解决方案:
1. 手动配置SqlSessionFactory和SqlSessionTemplate,为每个数据源创建对应的Bean。
2. 使用@MapperScan注解指定扫描路径时,需要指定sqlSessionTemplateRef或sqlSessionFactoryRef。
具体步骤:
步骤1:创建主数据源的SqlSessionFactory和SqlSessionTemplate
我们可以为每个数据源分别创建SqlSessionFactory和SqlSessionTemplate,并在创建SqlSessionFactory时指定对应的数据源和mapper.xml路径。
步骤2:配置多个数据源的MyBatis支持
由于我们使用了动态数据源,所以需要为每个数据源配置一个SqlSessionFactory(或者至少为默认数据源配置一个),但是注意,动态数据源切换时,实际使用的是同一个SqlSessionFactory,它内部会使用动态数据源。因此,我们实际上只需要配置一个SqlSessionFactory,但是要将其绑定到动态数据源上。
然而,在排除自动配置后,我们需要手动创建这个SqlSessionFactory,并且使用动态数据源作为其数据源。
步骤3:示例代码
首先,确保动态数据源已经配置成功(如之前所述,排除默认配置,配置多数据源)。
然后,手动创建SqlSessionFactoryBean,并设置动态数据源作为其数据源:
```java
@Configuration
public class MyBatisConfig {
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
// 设置数据源,这里的数据源是动态数据源
sessionFactory.setDataSource(dataSource);
// 设置mapper.xml的位置
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/**/*.xml"));
// 设置配置属性(可选)
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setMapUnderscoreToCamelCase(true);
sessionFactory.setConfiguration(configuration);
return sessionFactory.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
```
步骤4:在启动类上使用@MapperScan指定sqlSessionTemplateRef
如果你有多个SqlSessionTemplate,那么需要为不同的Mapper指定不同的SqlSessionTemplate。但通常,在动态数据源场景下,我们只需要一个SqlSessionTemplate,因为它内部使用的是动态数据源,会根据当前线程选择数据源。
因此,在启动类上可以这样配置:
```java
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class})
@MapperScan(basePackages = "com.example.mapper", sqlSessionTemplateRef = "sqlSessionTemplate")
public class Application {
// ...
}
```
注意:上面的sqlSessionTemplateRef的值是我们在MyBatisConfig中定义的SqlSessionTemplate的bean名称(默认是方法名)。
步骤5:如果使用事务,需要配置事务管理器
动态数据源需要配置一个事务管理器,它同样使用动态数据源。
```java
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
```
这样配置后,应该可以解决sqlSessionFactory和sqlSessionTemplate缺失的问题。
但是,请注意:如果我们的动态数据源配置正确,那么以上手动配置的SqlSessionFactory和SqlSessionTemplate会使用动态数据源,从而支持多数据源切换。
常见问题:
1. 如果出现“找不到数据源”的错误,请检查动态数据源配置是否正确。
2. 如果出现“找不到Mapper”的错误,请检查@MapperScan的路径是否正确。
引用:
[^1]: 动态数据源配置中,需要排除Spring Boot的默认数据源自动配置,否则会导致冲突。
[^2]: 手动配置SqlSessionFactory时,需要将动态数据源作为参数传入,因为动态数据源已经作为主数据源被Spring容器管理。
相关问题:
1. 如何配置动态数据源的事务管理器?
2. 在动态数据源环境下,如何配置MyBatis的PageHelper分页插件?
3. 动态数据源切换失败(如无法从主库切换到从库)如何排查?</think>### 解决移除 `DataSourceAutoConfiguration` 后出现 `sqlSessionFactory/sqlSessionTemplate` 缺失问题
当在 Spring Boot 多数据源配置中移除 `DataSourceAutoConfiguration` 后出现 `sqlSessionFactory` 或 `sqlSessionTemplate` required 错误,根本原因是 MyBatis 自动配置失效。以下是完整解决方案:
#### 问题核心原因
1. **自动配置链断裂**
移除 `DataSourceAutoConfiguration` 会导致依赖它的 `MybatisAutoConfiguration` 和 `MybatisPlusAutoConfiguration` 失效[^1]
$$ \text{失效链} : \text{DataSource} \rightarrow \text{SqlSessionFactory} \rightarrow \text{SqlSessionTemplate} $$
2. **关键组件缺失**
- `SqlSessionFactory`:MyBatis 核心工厂类,负责创建 SQL 会话
- `SqlSessionTemplate`:MyBatis-Spring 桥接组件,管理 SQL 会话生命周期
---
### 完整解决方案
#### 步骤1:手动配置 SqlSessionFactory
创建动态数据源专用的 SQL 会话工厂:
```java
@Configuration
public class MyBatisConfig {
// 注入动态数据源(由 dynamic-datasource 创建)
@Autowired
private DataSource dynamicDataSource;
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dynamicDataSource); // 关键:绑定动态数据源
// 添加 MyBatis 配置(示例)
org.apache.ibatis.session.Configuration config = new Configuration();
config.setMapUnderscoreToCamelCase(true);
factoryBean.setConfiguration(config);
// 设置 XML 映射文件位置
factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath*:mapper/**/*.xml"));
return factoryBean.getObject();
}
}
```
#### 步骤2:手动配置 SqlSessionTemplate
```java
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
```
#### 步骤3:修复 Mapper 扫描配置
在启动类添加正确注解:
```java
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class,
MybatisPlusAutoConfiguration.class // 必须排除自动配置
})
@MapperScan(
basePackages = "com.example.mapper",
sqlSessionFactoryRef = "sqlSessionFactory" // 指向手动配置的Bean
)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
```
#### 步骤4:验证 MyBatis-Plus 配置
如果使用 MyBatis-Plus,需额外配置:
```java
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
```
#### 步骤5:事务管理器修正
```java
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource); // 使用动态数据源
}
```
---
### 配置结构关系图
```mermaid
graph TD
A[动态数据源] --> B[SqlSessionFactory]
B --> C[SqlSessionTemplate]
C --> D[Mapper 接口]
D --> E[SQL 执行]
F[事务管理器] --> A
```
---
### 常见错误排查表
| 错误信息 | 解决方案 |
|---------|---------|
| `No qualifying bean of type 'SqlSessionFactory'` | 检查步骤1的Bean名称是否与`@MapperScan`中`sqlSessionFactoryRef`一致 |
| `MapperScannerRegistrar has no field sqlSessionTemplate` | 在`@MapperScan`中明确指定`sqlSessionTemplateRef` |
| `Invalid bound statement (not found)` | 检查`factoryBean.setMapperLocations()`路径是否正确 |
| 事务不生效 | 确保事务管理器使用动态数据源(步骤5) |
---
### 关键配置公式
MyBatis 组件恢复公式:
$$ \text{正常启动} = \left( \text{手动SqlSessionFactory} \land \text{正确MapperScan} \land \text{排除自动配置} \right) $$
其中:
- $手动SqlSessionFactory$ = 绑定动态数据源的工厂Bean
- $正确MapperScan$ = 通过`sqlSessionFactoryRef`显式关联
- $排除自动配置$ = 排除`DataSourceAutoConfiguration`和`MybatisPlusAutoConfiguration`
阅读全文
相关推荐












