Spring Boot多数据源配置报错:无法加载mongodb.jdbc.MongoDriver驱动类
我明白被困在这个问题两天有多沮丧——这种明明换个数据库就正常,偏偏卡在MongoDB上的问题最磨人。咱们先抓核心:MongoDB和PostgreSQL/MySQL这类关系型数据库的数据源逻辑完全不同,你之前用HikariCP来配置MongoDB的方式本身就有问题,这也是驱动加载报错的根源。
为什么换MySQL正常但MongoDB不行?
HikariCP是JDBC连接池,专门为关系型数据库的JDBC规范设计。MySQL和PostgreSQL都遵循JDBC标准,所以Hikari能正常加载它们的驱动;但MongoDB是文档型数据库,它的原生驱动并不属于JDBC体系,强行用Hikari的JDBC配置方式去套,自然会出现“找不到驱动”的错误。
正确的双数据源配置方案
下面是一步一步的正确配置方式,分开处理PostgreSQL(用HikariCP)和MongoDB(用Spring Data MongoDB原生支持):
1. 确保依赖正确
在你的pom.xml(或build.gradle)里,同时引入PostgreSQL+JDBC/Hikari和Spring Data MongoDB的依赖:
<!-- PostgreSQL + HikariCP --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> <!-- Spring Data MongoDB --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
2. 修正application.properties配置
把原来错误的MongoDB JDBC配置换成Spring Data MongoDB的原生配置,PostgreSQL的Hikari配置保留:
# PostgreSQL 数据源(HikariCP) spring.datasource.one.url=jdbc:postgresql://localhost:5432/your_pg_db spring.datasource.one.username=pg_user spring.datasource.one.password=pg_pass spring.datasource.one.driver-class-name=org.postgresql.Driver spring.datasource.one.hikari.maximum-pool-size=10 spring.datasource.one.hikari.connection-timeout=30000 # MongoDB 数据源(原生配置) spring.data.mongodb.uri=mongodb://localhost:27017/your_mongo_db # 如果MongoDB开启了认证,添加以下配置 spring.data.mongodb.username=mongo_user spring.data.mongodb.password=mongo_pass spring.data.mongodb.authentication-database=admin
⚠️ 注意:不要给MongoDB配置任何spring.datasource.*相关属性,那是给JDBC数据库用的!
3. 配置数据源对应的配置类
分别为PostgreSQL和MongoDB创建配置类,隔离两个数据源的操作:
PostgreSQL配置类
@Configuration @EnableJdbcRepositories( basePackages = "com.yourproject.repository.postgres", // PG仓库所在包 jdbcTemplateRef = "pgJdbcTemplate" ) public class PostgresDataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.one") public DataSource postgresDataSource() { return DataSourceBuilder.create().type(HikariDataSource.class).build(); } @Bean(name = "pgJdbcTemplate") public JdbcTemplate pgJdbcTemplate(@Qualifier("postgresDataSource") DataSource dataSource) { return new JdbcTemplate(dataSource); } }
MongoDB配置类
@Configuration @EnableMongoRepositories( basePackages = "com.yourproject.repository.mongo", // MongoDB仓库所在包 mongoTemplateRef = "mongoTemplate" ) public class MongoDataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.data.mongodb") public MongoClientSettings mongoClientSettings() { return MongoClientSettings.builder().build(); } @Bean public MongoClient mongoClient(MongoClientSettings settings) { return MongoClients.create(settings); } @Bean(name = "mongoTemplate") public MongoTemplate mongoTemplate(@Qualifier("mongoClient") MongoClient mongoClient) { return new MongoTemplate(mongoClient, "your_mongo_db"); // 填你的MongoDB库名 } }
常见错误排查点
如果你还是遇到问题,检查这几个地方:
- 有没有残留的MongoDB JDBC配置:比如
spring.datasource.two.driver-class-name这类属性,一定要删掉 - 版本兼容性:Spring Boot 3.x需要MongoDB Java Driver 4.x及以上,Spring Boot 2.x对应3.x版本的驱动,版本不匹配会导致驱动加载失败
- 依赖冲突:检查
mvn dependency:tree(或Gradle的依赖树),有没有同时引入MongoDB JDBC驱动和Spring Data MongoDB,两者可能冲突
替代方案:MongoDB JDBC驱动(不推荐)
如果你因为某些原因必须用JDBC方式连接MongoDB,可以尝试引入MongoDB官方JDBC驱动,但这种方式不如Spring Data MongoDB适配Spring Boot:
- 引入依赖:
<dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-jdbc-driver</artifactId> <version>2.0.0</version> <!-- 用对应版本 --> </dependency>
- 配置JDBC格式的数据源:
spring.datasource.two.url=jdbc:mongodb://localhost:27017/your_mongo_db spring.datasource.two.username=mongo_user spring.datasource.two.password=mongo_pass spring.datasource.two.driver-class-name=com.mongodb.jdbc.MongoDriver
但还是强烈建议用Spring Data MongoDB的原生方式,更符合Spring Boot的生态。
希望这些步骤能帮你解决问题!如果还有具体的报错信息,可以贴出来咱们再细化排查。
内容的提问来源于stack exchange,提问作者Kunle Ajiboye

