使用com.baomidou支持多数据源配置时,spring.datasource.dynamic.datasource.ora与spring.datasource.dynamic.datasource.pg。启动报错Unsatisfied dependency expressed through constructor parameter 1: Error creating bean with name 'gpMapper' defined in file。Error creating bean with name 'sqlSessionFactory' defined in class path resource
时间: 2025-07-20 17:27:24 浏览: 2
<think>我们面对的是一个Spring Boot多数据源配置问题,用户在使用com.baomidou动态数据源时遇到启动错误,具体错误信息涉及依赖注入失败和Bean创建异常。根据用户提供的信息,错误可能与动态数据源配置(ora和pg)有关,错误信息包括:
1. `Unsatisfied dependency`:构造函数参数1不满足依赖
2. `Error creating bean with name 'gpMapper'`:创建名为'gpMapper'的Bean失败
3. `Error creating bean with name 'sqlSessionFactory'`:创建名为'sqlSessionFactory'的Bean失败
同时,用户还提供了两个引用:
- 引用[^1]:指出由于无法确定嵌入式数据库驱动类而导致数据源创建失败,通常是因为没有配置数据库或者没有添加相应的驱动依赖。
- 引用[^2]:建议引入`spring-jdbc`包来解决嵌入式数据源的问题。
但是,用户的问题是关于多数据源配置,而不是嵌入式数据库。因此,我们需要关注多数据源配置的正确性。
### 问题分析
1. **依赖注入失败(Unsatisfied dependency)**:通常是因为Spring容器中找不到所需的Bean。在创建`gpMapper`时,可能依赖的某个Bean(如数据源或SqlSessionFactory)没有正确创建。
2. **数据源配置问题**:动态数据源配置可能不正确,导致数据源Bean无法创建。
3. **SqlSessionFactory创建失败**:MyBatis的SqlSessionFactory依赖于数据源,如果数据源配置有问题,会导致SqlSessionFactory创建失败。
### 解决步骤
#### 1. 检查依赖
确保项目中已经正确引入`dynamic-datasource-spring-boot-starter`(com.baomidou的多数据源启动器)以及数据库驱动(如Oracle和PostgreSQL的驱动)。
Maven依赖示例:
```xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.0</version> <!-- 请使用最新版本 -->
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>21.5.0.0</version> <!-- Oracle驱动 -->
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.3.1</version> <!-- PostgreSQL驱动 -->
</dependency>
```
#### 2. 检查多数据源配置
在`application.yml`(或`application.properties`)中配置动态数据源。注意配置的格式和属性名是否正确。
示例配置(application.yml):
```yaml
spring:
datasource:
dynamic:
primary: master # 设置默认的数据源或者数据源组,默认值即为master
strict: false # 严格匹配数据源,默认false。true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
master:
url: jdbc:postgresql://localhost:5432/test
username: postgres
password: 123456
driver-class-name: org.postgresql.Driver
ora:
url: jdbc:oracle:thin:@localhost:1521:ORCL
username: test
password: test
driver-class-name: oracle.jdbc.OracleDriver
pg:
url: jdbc:postgresql://localhost:5432/test2
username: postgres
password: 123456
driver-class-name: org.postgresql.Driver
```
注意:属性名`spring.datasource.dynamic.datasource`下的数据源名称(如`ora`、`pg`)需要与代码中使用的注解一致。
#### 3. 检查Mapper和Service中的注解使用
在使用多数据源时,需要在Service或Mapper上使用`@DS`注解指定数据源名称。
例如:
```java
@Service
@DS("ora") // 指定使用ora数据源
public class OraServiceImpl implements IOraService {
// ...
}
@Service
@DS("pg")
public class PgServiceImpl implements IPgService {
// ...
}
```
如果是在Mapper接口上使用:
```java
@Mapper
@DS("pg")
public interface GpMapper {
// ...
}
```
#### 4. 检查SqlSessionFactory配置
如果自定义了SqlSessionFactory,需要确保配置正确。在多数情况下,使用`dynamic-datasource-spring-boot-starter`后,不需要手动配置SqlSessionFactory,因为starter已经自动配置了。
如果确实需要自定义,请确保使用动态数据源(DynamicDataSource)作为数据源。
示例(如果必须自定义):
```java
@Configuration
public class MyBatisConfig {
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource); // 这里的数据源应该是动态数据源
// 其他配置...
return sessionFactory.getObject();
}
}
```
注意:参数`DataSource`应该是动态数据源,它已经由starter创建并注入到Spring容器中。
#### 5. 检查包扫描
确保MyBatis的Mapper接口被正确扫描。在启动类上添加`@MapperScan`注解,并指定Mapper接口所在的包。
```java
@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
```
#### 6. 检查数据库驱动类名
在配置中,`driver-class-name`属性必须正确。Oracle的驱动类名为`oracle.jdbc.OracleDriver`(新版本)或`oracle.jdbc.driver.OracleDriver`(旧版本),PostgreSQL的为`org.postgresql.Driver`。
#### 7. 检查数据库连接信息
确保数据库的URL、用户名和密码正确,并且数据库服务可用。
#### 8. 检查Spring Boot版本兼容性
确保`dynamic-datasource-spring-boot-starter`的版本与Spring Boot版本兼容。
### 常见错误原因
- **数据源配置错误**:属性名写错,比如`spring.datasource.dynamic.datasource.ora`写成了`spring.datasource.dynamic.ora`。
- **缺少数据库驱动**:没有引入Oracle或PostgreSQL的JDBC驱动。
- **未指定主数据源**:在动态数据源配置中,如果没有设置`primary`属性,且存在多个数据源,需要明确指定一个主数据源(默认使用`master`作为主数据源,如果主数据源名称不是`master`,则需要通过`primary`属性指定)。
- **`@DS`注解使用位置错误**:`@DS`注解应该加在Service层的方法或类上,或者Mapper接口上,不要同时加在Service和Mapper上(可能会导致数据源切换两次)。
- **动态数据源与MyBatis配置冲突**:如果项目中有自定义的`DataSource`或`SqlSessionFactory`,可能会覆盖动态数据源的自动配置。
### 示例代码
下面是一个简单的多数据源配置示例:
1. **application.yml**:
```yaml
spring:
datasource:
dynamic:
primary: master
datasource:
master:
url: jdbc:postgresql://localhost:5432/master
username: postgres
password: 123456
driver-class-name: org.postgresql.Driver
ora:
url: jdbc:oracle:thin:@localhost:1521:ORCL
username: test
password: test
driver-class-name: oracle.jdbc.OracleDriver
pg:
url: jdbc:postgresql://localhost:5432/slave
username: postgres
password: 123456
driver-class-name: org.postgresql.Driver
```
2. **Mapper接口**:
```java
@Mapper
public interface CommonMapper {
// 默认使用主数据源(master)
@Select("SELECT * FROM table")
List<Map<String, Object>> selectAll();
}
@Mapper
@DS("ora")
public interface OraMapper {
@Select("SELECT * FROM ora_table")
List<Map<String, Object>> selectOraData();
}
@Mapper
@DS("pg")
public interface PgMapper {
@Select("SELECT * FROM pg_table")
List<Map<String, Object>> selectPgData();
}
```
3. **Service层**:
```java
@Service
public class DataService {
@Autowired
private CommonMapper commonMapper;
@Autowired
private OraMapper oraMapper;
@Autowired
private PgMapper pgMapper;
// 使用不同数据源的方法
public List<Map<String, Object>> getMasterData() {
return commonMapper.selectAll();
}
public List<Map<String, Object>> getOraData() {
return oraMapper.selectOraData();
}
public List<Map<String, Object>> getPgData() {
return pgMapper.selectPgData();
}
}
```
### 总结
用户的问题主要集中在动态数据源的配置和Bean的依赖注入上。需要仔细检查配置文件的格式、数据源名称、驱动类名,以及代码中`@DS`注解的使用。同时,确保数据库驱动依赖已正确引入。如果问题仍然存在,可以查看完整的堆栈错误信息,定位是哪个Bean的创建失败,再具体分析。
§§相关问题§§
1. 如何解决Spring Boot中多数据源配置下的依赖注入失败问题?
2. 在使用com.baomidou动态数据源时,如何正确配置Oracle和PostgreSQL数据源?
3. 如何排查Spring Boot启动时Bean创建失败的问题?</think>### 问题分析
您在使用com.baomidou配置多数据源时遇到的启动错误,主要涉及以下核心问题:
1. **依赖注入失败**:`Unsatisfied dependency constructor parameter 1` 表示Spring容器无法满足构造函数第一个参数的依赖
2. **Bean创建异常**:`gpMapper`和`sqlSessionFactory`的Bean创建失败
3. **动态数据源配置**:ora和pg数据源的配置可能存在冲突或不完整
### 解决方案步骤
#### 1. 检查基础依赖配置
确保`pom.xml`包含必要依赖:
```xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>21.5.0.0</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.3.1</version>
</dependency>
```
#### 2. 修正动态数据源配置
在`application.yml`中确保正确配置:
```yaml
spring:
datasource:
dynamic:
primary: master # 设置默认数据源
datasource:
master: # 主数据源
url: jdbc:postgresql://localhost:5432/main
username: postgres
password: 123456
driver-class-name: org.postgresql.Driver
ora:
url: jdbc:oracle:thin:@//host:1521/ORCL
username: ora_user
password: ora_pass
driver-class-name: oracle.jdbc.OracleDriver
pg:
url: jdbc:postgresql://localhost:5432/secondary
username: pg_user
password: pg_pass
driver-class-name: org.postgresql.Driver
```
#### 3. 解决SqlSessionFactory冲突
创建自定义配置类:
```java
@Configuration
public class MybatisConfig {
@Bean("sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
// 添加其他必要配置
return sessionFactory.getObject();
}
}
```
#### 4. 修复Mapper扫描问题
在启动类添加注解:
```java
@SpringBootApplication
@MapperScan(basePackages = "com.yourpackage.mapper", sqlSessionFactoryRef = "sqlSessionFactory")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
```
#### 5. 验证数据源注解使用
在Service层正确使用`@DS`注解:
```java
@Service
public class YourService {
@DS("ora") // 指定使用ora数据源
public void oraOperation() {
// Oracle数据库操作
}
@DS("pg") // 指定使用pg数据源
public void pgOperation() {
// PostgreSQL数据库操作
}
}
```
### 关键注意事项
1. **驱动类名验证**:
- Oracle: `oracle.jdbc.OracleDriver`
- PostgreSQL: `org.postgresql.Driver`
2. **配置项严格匹配**:
- 确保所有数据源配置项使用**统一缩进格式**
- 检查`spring.datasource.dynamic.datasource`下每个数据源名称的一致性
3. **Bean名称冲突**:
- 使用`@Bean(name = "customName")`显式命名Bean
- 在注入点使用`@Qualifier`指定Bean名称
4. **依赖完整性**:
```xml
<!-- 确保包含spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
```
### 错误排查流程图
```mermaid
graph TD
A[启动失败] --> B{检查异常栈}
B --> C[BeanCreationException]
C --> D[检查数据源配置]
D --> E{配置完整?}
E -->|是| F[检查驱动依赖]
E -->|否| G[补全缺失配置]
F --> H{驱动存在?}
H -->|是| I[验证SqlSessionFactory配置]
H -->|否| J[添加对应数据库驱动]
I --> K{自定义配置存在?}
K -->|是| L[检查Bean名称冲突]
K -->|否| M[添加SqlSessionFactory配置]
L --> N[使用@Qualifier解决冲突]
```
### 常见问题解决
1. **UnsatisfiedDependencyException**:
- 检查构造函数参数类型是否与Bean类型匹配
- 使用`@Autowired(required = false)`标记可选依赖
2. **DataSource初始化失败**:
```java
@Bean
@ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.ora")
public DataSource oraDataSource() {
return DataSourceBuilder.create().build();
}
```
3. **多数据源事务管理**:
```java
@Bean
public PlatformTransactionManager transactionManager(
@Qualifier("dynamicDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
```
通过以上步骤,应能解决动态数据源配置导致的启动错误。重点检查数据源配置完整性、Bean名称冲突以及必要的依赖项。
阅读全文
相关推荐


















