You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)。

解决步骤

  1. 创建并配置.env文件

    • 在项目根目录新建.env文件,添加你的MongoDB集群SRV地址:
      MONGO_CLUSTER=cluster0.mongodb.net
      
    • 将cluster0.mongodb.net替换为实际的集群地址。
  2. 确保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);
          }
      }
      
  3. 正确配置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=<数据库名>
        
    • 替换尖括号内的内容为你的MongoDB实际信息。
  4. 验证环境变量解析结果

    • 在启动类添加日志输出,确认变量是否正确加载:
      @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);
          }
      }
      
    • 启动应用后查看控制台,若输出实际集群地址,说明解析正常。
  5. 检查加载优先级

    • spring-dotenv在Spring Boot 3.x中默认优先于MongoDB自动配置加载,无需额外调整,若仍有问题,可确认.env文件路径是否正确、文件是否被IDE识别。

内容的提问来源于stack exchange,提问作者Any

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:07:03