Spring Boot内嵌MongoDB连接被拒绝问题求助
嘿,我之前在测试Spring Boot内嵌MongoDB的时候也踩过这个连接拒绝的坑,咱们一步步来排查解决:
1. 先确认内嵌Mongo的依赖有没有加对
Spring Boot本身不会自动引入内嵌Mongo的依赖,你得手动加上Flapdoodle的内嵌Mongo包,同时确保Spring Data MongoDB的starter也在依赖里。
如果是Maven项目,在pom.xml里加这些:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>de.flapdoodle.embed</groupId> <artifactId>de.flapdoodle.embed.mongo</artifactId> <scope>test</scope> </dependency>
Gradle的话就在build.gradle里加:
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' testImplementation 'de.flapdoodle.embed:de.flapdoodle.embed.mongo'
2. 检查测试类的注解配置
你现在的测试类用了@SpringBootTest(classes=MongoConfig.class),这里可能有问题:如果你的MongoConfig是自定义的Mongo配置类,它可能没有启用内嵌Mongo的自动配置逻辑。
最简单的解决办法是:
- 要么去掉
classes=MongoConfig.class参数,让Spring Boot自动加载所有配置(包括内嵌Mongo的自动配置) - 要么给测试类加上
@AutoConfigureEmbeddedMongo注解,强制启动内嵌Mongo实例
修改后的测试类应该是这样:
@RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureEmbeddedMongo @TestPropertySource(locations = "classpath:application-test.properties") public class Test_TimezoneDao { // 你的测试代码 }
3. 检查测试环境的配置文件(application-test.properties)
如果你的配置文件里写了spring.data.mongodb.host、spring.data.mongodb.port或者spring.data.mongodb.uri,指向的是外部MongoDB(比如本地的27017端口,但你没启动外部Mongo),那肯定会报连接拒绝。
解决办法:
- 直接删掉这些MongoDB连接配置,让Spring Boot自动使用内嵌Mongo的默认配置
- 或者明确指定用随机端口(让内嵌Mongo自己分配端口):
spring.data.mongodb.port=0
4. 排查自定义MongoConfig的冲突
如果你的MongoConfig类里手动创建了MongoClient或者MongoTemplate,那它可能会覆盖Spring Boot自动配置的内嵌Mongo实例。
这时候可以:
- 在测试类上用
@EnableAutoConfiguration(exclude = MongoConfig.class),禁用自定义配置,改用自动配置的内嵌Mongo - 或者修改
MongoConfig,让它在测试环境下优先使用内嵌Mongo的配置(比如通过@Profile注解区分环境)
5. 极端情况:内嵌Mongo启动超时
有时候系统资源不足或者网络限制,会导致内嵌Mongo启动太慢,超过默认超时时间。你可以在application-test.properties里增加超时时间:
spring.mongodb.embedded.timeout=30000
先从前面两点开始排查,这是最常见的问题,应该能解决你的连接拒绝错误。
内容的提问来源于stack exchange,提问作者tenticon

