【问题标题】:Spring Boot with Embedded Mongo : Cannot assign requested address: JVM_Bind带有嵌入式 Mongo 的 Spring Boot:无法分配请求的地址:JVM_Bind
【发布时间】:2018-01-24 05:22:02
【问题描述】:

我正在尝试为带有嵌入式 Mongo 和 Kafka 的 Spring Boot 设置 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'

【问题讨论】:

    标签: spring mongodb spring-boot spring-boot-test


    【解决方案1】:

    这个注解:@DataMongoTest 导致 Spring Boot 创建一个嵌入式 Mongo 实例。异常消息告诉我们嵌入式 Mongo 实例无法启动,因为已经有一个进程在它试图运行的端口上运行。

    嵌入式Mongo实例由EmbeddedMongoAutoConfiguration配置,Spring Boot应用的策略-用于端口分配-如下:

    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 构造函数中放置一个断点并查看属性参数,我想你会看到该配置类使用的实际值不为零。如果传递给 EmbeddedMongoAutoConfiguration 的端口值实际上为零,但您仍然收到 JVM_Bind 错误,则表明此调用:Network.getFreeServerPort(this.getHost()) 没有返回空闲端口,这似乎不太可能。

    为了解决这个问题:只要你用spring.data.mongodb.port=0配置你的测试上下文,那么嵌入式Mongo实例将被分配一个随机端口,这个随机端口将被你的Spring上下文的其他方面知道(例如作为你的MongoTemplate),它需要与那个 Mongo 实例对话。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2016-12-16
      • 2021-11-03
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多