Spring 使用嵌入式启动 Mongo:无法分配请求的地址:JVM_Bind
Spring Boot with Embedded Mongo : Cannot assign requested address: JVM_Bind
我正在尝试为带有嵌入式 Mongo 和 Kafka 的 Spring 引导设置 JUnit 测试 :-
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE,
classes = {AccountingApplication.class})
@DataMongoTest
public class BaseEmbeddedTest {
@ClassRule
public static KafkaEmbedded embeddedKafka = new KafkaEmbedded(1, true);
@Autowired
private MongoTemplate mongoTemplate;
@Test
public void emptyTest(){
}
}
src/test/resources/application.yml :-
spring:
data:
mongodb:
port: 0
kafka:
bootstrap-servers: ${spring.embedded.kafka.brokers}
问题
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [de.flapdoodle.embed.mongo.config.IMongodConfig]: Factory method 'embeddedMongoConfiguration' threw exception; nested exception is java.net.BindException: Cannot assign requested address: JVM_Bind
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)
... 140 more
Caused by: java.net.BindException: Cannot assign requested address: JVM_Bind
at java.net.DualStackPlainSocketImpl.bind0(Native Method)
at java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106)
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:190)
at java.net.ServerSocket.bind(ServerSocket.java:375)
at java.net.ServerSocket.<init>(ServerSocket.java:237)
at de.flapdoodle.embed.process.runtime.Network.getFreeServerPort(Network.java:80)
at org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration.embeddedMongoConfiguration(EmbeddedMongoAutoConfiguration.java:147)
我在这里做错了什么?
版本:-
dependencyManagementPluginVersion = '1.0.3.RELEASE'
springBootVersion = '1.5.6.RELEASE'
springCloudVersion = 'Dalston.SR2'
projectVersion = '0.0.1-SNAPSHOT'
javaVersion = 1.8
kotlinVersion = '1.1.4'
此注释:@DataMongoTest
导致 Spring 引导创建嵌入式 Mongo 实例。异常消息告诉我们嵌入式 Mongo 实例无法启动,因为在它尝试 运行 的端口上已经有一个进程 运行ning。
嵌入式 Mongo 实例由 EmbeddedMongoAutoConfiguration
配置,Spring 启动应用的策略 - 用于端口分配 - 如下:
if configured Mongo port > 0 then
use the configured port
else
assign a random port
end
因此,我怀疑您的测试上下文配置了 spring.data.mongodb.port
的非零值。我知道你发布了你的 application.yml 这意味着你 - 正确地 - 将零值分配给 spring.data.mongodb.port
但是如果你在 EmbeddedMongoAutoConfiguration
构造函数中放置一个断点并查看我认为的属性参数您会看到该配置 class 使用的实际值不为零。如果传递给 EmbeddedMongoAutoConfiguration
的端口值实际上为零,但您仍然收到 JVM_Bind 错误,则这意味着此调用:Network.getFreeServerPort(this.getHost())
未返回空闲端口,这似乎不太可能。
为了解决这个问题:只要您使用 spring.data.mongodb.port=0
配置测试上下文,那么嵌入式 Mongo 实例将被分配一个随机端口,并且这个随机端口将被告知您的 Spring 上下文的其他方面(例如您的 MongoTemplate
)需要与该 Mongo 实例对话。
我正在尝试为带有嵌入式 Mongo 和 Kafka 的 Spring 引导设置 JUnit 测试 :-
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE,
classes = {AccountingApplication.class})
@DataMongoTest
public class BaseEmbeddedTest {
@ClassRule
public static KafkaEmbedded embeddedKafka = new KafkaEmbedded(1, true);
@Autowired
private MongoTemplate mongoTemplate;
@Test
public void emptyTest(){
}
}
src/test/resources/application.yml :-
spring:
data:
mongodb:
port: 0
kafka:
bootstrap-servers: ${spring.embedded.kafka.brokers}
问题
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [de.flapdoodle.embed.mongo.config.IMongodConfig]: Factory method 'embeddedMongoConfiguration' threw exception; nested exception is java.net.BindException: Cannot assign requested address: JVM_Bind
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)
... 140 more
Caused by: java.net.BindException: Cannot assign requested address: JVM_Bind
at java.net.DualStackPlainSocketImpl.bind0(Native Method)
at java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106)
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:190)
at java.net.ServerSocket.bind(ServerSocket.java:375)
at java.net.ServerSocket.<init>(ServerSocket.java:237)
at de.flapdoodle.embed.process.runtime.Network.getFreeServerPort(Network.java:80)
at org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration.embeddedMongoConfiguration(EmbeddedMongoAutoConfiguration.java:147)
我在这里做错了什么?
版本:-
dependencyManagementPluginVersion = '1.0.3.RELEASE'
springBootVersion = '1.5.6.RELEASE'
springCloudVersion = 'Dalston.SR2'
projectVersion = '0.0.1-SNAPSHOT'
javaVersion = 1.8
kotlinVersion = '1.1.4'
此注释:@DataMongoTest
导致 Spring 引导创建嵌入式 Mongo 实例。异常消息告诉我们嵌入式 Mongo 实例无法启动,因为在它尝试 运行 的端口上已经有一个进程 运行ning。
嵌入式 Mongo 实例由 EmbeddedMongoAutoConfiguration
配置,Spring 启动应用的策略 - 用于端口分配 - 如下:
if configured Mongo port > 0 then
use the configured port
else
assign a random port
end
因此,我怀疑您的测试上下文配置了 spring.data.mongodb.port
的非零值。我知道你发布了你的 application.yml 这意味着你 - 正确地 - 将零值分配给 spring.data.mongodb.port
但是如果你在 EmbeddedMongoAutoConfiguration
构造函数中放置一个断点并查看我认为的属性参数您会看到该配置 class 使用的实际值不为零。如果传递给 EmbeddedMongoAutoConfiguration
的端口值实际上为零,但您仍然收到 JVM_Bind 错误,则这意味着此调用:Network.getFreeServerPort(this.getHost())
未返回空闲端口,这似乎不太可能。
为了解决这个问题:只要您使用 spring.data.mongodb.port=0
配置测试上下文,那么嵌入式 Mongo 实例将被分配一个随机端口,并且这个随机端口将被告知您的 Spring 上下文的其他方面(例如您的 MongoTemplate
)需要与该 Mongo 实例对话。