【问题标题】:Cannot connect to from Spring Boot to Dockerized MongoDb instance无法从 Spring Boot 连接到 Dockerized MongoDb 实例
【发布时间】:2021-06-26 20:06:15
【问题描述】:

我有一个 dockerized MongoDB 实例。我正在尝试让 Spring Boot 连接到它,但是在启动 Spring Boot 时却收到一条错误消息。

请在下面找到详细信息。

错误信息:

    com.mongodb.MongoSocketException: mongodb://localhost:27017/airbnb-data
        at com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:211) ~[mongodb-driver-core-3.11.1.jar:na]
        at com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:75) ~[mongodb-driver-core-3.11.1.jar:na]
        at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65) ~[mongodb-driver-core-3.11.1.jar:na]
        at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:128) ~[mongodb-driver-core-3.11.1.jar:na]
        at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117) ~[mongodb-driver-core-3.11.1.jar:na]
        at java.lang.Thread.run(Thread.java:748) [na:1.8.0_281]
Caused by: java.net.UnknownHostException: mongodb://localhost:27017/airbnb-data
        at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) ~[na:1.8.0_281]
        at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:929) ~[na:1.8.0_281]
        at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1324) ~[na:1.8.0_281]
        at java.net.InetAddress.getAllByName0(InetAddress.java:1277) ~[na:1.8.0_281]
        at java.net.InetAddress.getAllByName(InetAddress.java:1193) ~[na:1.8.0_281]
        at java.net.InetAddress.getAllByName(InetAddress.java:1127) ~[na:1.8.0_281]
        at com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:203) ~[mongodb-driver-core-3.11.1.jar:na]

Spring Boot 应用中的 application.properties:

spring.data.mongodb.uri=mongodb://localhost:27017/airbnb-data
spring.data.mongodb.port=27017
spring.data.mongodb.database=airbnb-data
spring.data.mongodb.host=localhost
spring.data.mongodb.username=mongodbuser
spring.data.mongodb.password=mongodbpwd

docker-compose.yml 启动 MongoDB 实例:

version: '3'
services:

  mongoex:
    image: mongo-express
    environment:
      ME_CONFIG_OPTIONS_EDITORTHEME: ambiance
      ME_CONFIG_MONGODB_SERVER: mongodb
      ME_CONFIG_MONGODB_PORT: 27017
      ME_CONFIG_MONGODB_ENABLE_ADMIN: "true"
      ME_CONFIG_MONGODB_ADMINUSERNAME: mongodbuser
      ME_CONFIG_MONGODB_ADMINPASSWORD: mongodbpwd
      ME_CONFIG_MONGODB_AUTH_DATABASE: admin
      ME_CONFIG_MONGODB_AUTH_USERNAME: mongodbuser
      ME_CONFIG_MONGODB_AUTH_PASSWORD: mongodbpwd
      ME_CONFIG_BASICAUTH_USERNAME: mongoexuser
      ME_CONFIG_BASICAUTH_PASSWORD: mongoexpwd
    ports:
      - "8081:8081"
    links:
      - mongodb
    networks:
      - backend
      - frontend

  mongodb:
    image: mongo:latest
    container_name: mongodb
    restart: unless-stopped
    command: mongod --auth
    environment:
      MONGO_INITDB_ROOT_USERNAME: mongodbuser
      MONGO_INITDB_ROOT_PASSWORD: mongodbpwd
      MONGODB_DATA_DIR: /data/db
      MONDODB_LOG_DIR: /dev/null
    ports:
      - "27017:27017"
    volumes:
      - mongodbdata:/data/db
    networks:
      - backend
      - frontend

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge

volumes:
  mongodbdata:
    driver: local

DataConfig 类:

@Configuration
public class DatabaseConfig extends AbstractMongoConfiguration {

    @Value("${spring.data.mongodb.myuri}")
    private String mongoDbUrl;
    @Value("${spring.data.mongodb.port}")
    private String port;
    @Value("${spring.data.mongodb.database}")
    private String mongoDbName;

    /**
     * Url to mongo db
     * 
     * @return a string representing the url of bdd
     * @throws MalformedURLException
     */

    
    @Override
    public MongoClient mongoClient() {
        return new MongoClient(this.mongoDbUrl, Integer.parseInt(this.port));

    }
    

    
    @Override
    public @Bean MongoTemplate mongoTemplate() throws Exception {
        MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory()),
                new MongoMappingContext());
        converter.setMapKeyDotReplacement("\\+");

        MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory(), converter);

        return mongoTemplate;

    }

    @Override
    protected String getDatabaseName() {

        return this.mongoDbName;
    }

    /**
     * Access to Mongo db
     * 
     * @return link to db
     * @throws Exception
     *
     * @Bean public MongoTemplate accessBddMongo() throws Exception { return new
     *       MongoTemplate(bddGetEndpointUrl(), mongoDbName); }
     */

}

感谢您的帮助

【问题讨论】:

  • 我不确定,但我认为如果你设置了spring.data.mongodb.host 和你设置的其他属性,你不应该设置spring.data.mongodb.uri
  • 我删除了spring.data.mongodb.uri,但问题仍然存在

标签: spring mongodb spring-boot docker


【解决方案1】:

我意识到我不需要在 DataConfig 类中设置 mongoClient() 方法。 修改后,我有:

    @Override
    public MongoClient mongoClient() {
        return new MongoClient();

    }

解决了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-29
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 2021-06-06
    • 2019-11-06
    相关资源
    最近更新 更多