Spring Boot集成MongoDB时SRV主机名格式错误致Bean创建失败
问题:Spring Boot集成MongoDB启动失败
报错信息展示
ApplicationContext启动失败。若要显示条件评估报告,请启用'debug'模式重新运行应用。 2023-08-20T13:02:09.356+05:30 ERROR 22968 --- [ restartedMain] o.s.boot.SpringApplication : 应用运行失败 org.springframework.beans.factory.BeanCreationException: 创建类路径资源[org/springframework/boot/autoconfigure/mongo/MongoAutoConfiguration.class]中定义的名称为'mongo'的Bean时出错:无法实例化[com.mongodb.client.MongoClient]:工厂方法'mongo'抛出异常,消息为:提供的SRV主机名'${env.MONGO_CLUSTER}'未包含至少三个部分。它必须包含主机名、域名和顶级域名。 at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:659) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:647) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1332) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1162) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:560) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:973) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:942) ~[spring-context-6.0.11.jar:6.0.11] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:608) ~[spring-context-6.0.11.jar:6.0.11] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.1.2.jar:3.1.2] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) ~[spring-boot-3.1.2.jar:3.1.2] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:436) ~[spring-boot-3.1.2.jar:3.1.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) ~[spring-boot-3.1.2.jar:3.1.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-3.1.2.jar:3.1.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-3.1.2.jar:3.1.2] at com.example.full.FullApplication.main(FullApplication.java:10) ~[classes/:na] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:578) ~[na:na] at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50) ~[spring-boot-devtools-3.1.2.jar:3.1.2] Caused by: org.springframework.beans.BeanInstantiationException: 无法实例化[com.mongodb.client.MongoClient]:工厂方法'mongo'抛出异常,消息为:提供的SRV主机名'${env.MONGO_CLUSTER}'未包含至少三个部分。它必须包含主机名、域名和顶级域名。 at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:171) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:655) ~[spring-beans-6.0.11.jar:6.0.11] ... 22 common frames omitted Caused by: java.lang.IllegalArgumentException: 提供的SRV主机名'${env.MONGO_CLUSTER}'未包含至少三个部分。它必须包含主机名、域名和顶级域名。 at com.mongodb.connection.ClusterSettings.(ClusterSettings.java:594) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.connection.ClusterSettings.(ClusterSettings.java:50) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.connection.ClusterSettings$Builder.build(ClusterSettings.java:370) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.MongoClientSettings.(MongoClientSettings.java:957) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.MongoClientSettings.(MongoClientSettings.java:64) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.MongoClientSettings$Builder.build(MongoClientSettings.java:600) ~[mongodb-driver-core-4.9.1.jar:na] at org.springframework.boot.autoconfigure.mongo.MongoClientFactorySupport.createMongoClient(MongoClientFactorySupport.java:50) ~[spring-boot-autoconfigure-3.1.2.jar:3.1.2] at org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration.mongo(MongoAutoConfiguration.java:59) ~[spring-boot-autoconfigure-3.1.2.jar:3.1.2] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:578) ~[na:na] at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:139) ~[spring-beans-6.0.11.jar:6.0.11] ... 23 common frames omitted 进程以退出码0结束
pom.xml配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.2</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>full</artifactId> <version>0.0.1-SNAPSHOT</version> <name>full</name> <description>Spring Boot演示项目</description> <properties> <java.version>20</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>me.paulschwarz</groupId> <artifactId>spring-dotenv</artifactId> <version>4.0.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
问题排查与解决
核心原因
报错显示MongoDB将${env.MONGO_CLUSTER}占位符直接当作SRV主机名,说明环境变量未被正确解析,导致MongoClient收到未替换的占位符字符串,不符合SRV主机名格式要求(需包含主机名、域名、顶级域名三部分,例如cluster0.mongodb.net)。
解决步骤
创建并配置.env文件
- 在项目根目录新建
.env文件,添加你的MongoDB集群SRV地址:MONGO_CLUSTER=cluster0.mongodb.net - 将
cluster0.mongodb.net替换为实际的集群地址。
- 在项目根目录新建
确保spring-dotenv生效
- spring-dotenv 4.x在Spring Boot 3.x中默认自动加载
.env文件,若未生效,可在启动类添加注解:@SpringBootApplication @DotenvPropertySource public class FullApplication { public static void main(String[] args) { SpringApplication.run(FullApplication.class, args); } }
- spring-dotenv 4.x在Spring Boot 3.x中默认自动加载
正确配置MongoDB连接
- 在
application.properties或application.yml中使用解析后的环境变量:- 方式一(推荐完整URI):
spring.data.mongodb.uri=mongodb+srv://<用户名>:<密码>@${MONGO_CLUSTER}/<数据库名>?retryWrites=true&w=majority - 方式二(单独配置参数):
spring.data.mongodb.host=${MONGO_CLUSTER} spring.data.mongodb.username=<用户名> spring.data.mongodb.password=<密码> spring.data.mongodb.database=<数据库名>
- 方式一(推荐完整URI):
- 替换尖括号内的内容为你的MongoDB实际信息。
- 在
验证环境变量解析结果
- 在启动类添加日志输出,确认变量是否正确加载:
@SpringBootApplication @DotenvPropertySource public class FullApplication { @Value("${MONGO_CLUSTER}") private String mongoCluster; public static void main(String[] args) { SpringApplication.run(FullApplication.class, args); } @PostConstruct public void checkEnv() { System.out.println("已加载的Mongo集群地址:" + mongoCluster); } } - 启动应用后查看控制台,若输出实际集群地址,说明解析正常。
- 在启动类添加日志输出,确认变量是否正确加载:
检查加载优先级
- spring-dotenv在Spring Boot 3.x中默认优先于MongoDB自动配置加载,无需额外调整,若仍有问题,可确认
.env文件路径是否正确、文件是否被IDE识别。
- spring-dotenv在Spring Boot 3.x中默认优先于MongoDB自动配置加载,无需额外调整,若仍有问题,可确认
内容的提问来源于stack exchange,提问作者Any
相关产品推荐
相关产品推荐

