mongo 配置无效,必须指定 uri 或 host/port/credentials

Posted

技术标签:

【中文标题】mongo 配置无效,必须指定 uri 或 host/port/credentials【英文标题】:Invalid mongo configuration, either uri or host/port/credentials must be specified 【发布时间】:2017-08-21 14:39:51 【问题描述】:

我遇到了这个异常:

Caused by: java.lang.IllegalStateException: Invalid mongo configuration, either uri or host/port/credentials must be specified
    at org.springframework.boot.autoconfigure.mongo.MongoProperties.createMongoClient(MongoProperties.java:207)
    at org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration.mongo(MongoAutoConfiguration.java:73)
    at org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration$$EnhancerBySpringCGLIB$$15f9b896.CGLIB$mongo$1(<generated>)
    at org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration$$EnhancerBySpringCGLIB$$15f9b896$$FastClassBySpringCGLIB$$c0338f6a.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:356)
    at org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration$$EnhancerBySpringCGLIB$$15f9b896.mongo(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162)
    ... 25 common frames omitted

这是我的 application.yml 内容:

spring:
  data:
    mongodb:
      uri: mongodb://develop:d3VeL0p$@<my_host>:27017/SHAM

这是我的配置类:

package com.me.service.testservice.config;

import com.mongodb.MongoClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

@Configuration
@EnableMongoRepositories(basePackages = "com.me.service.testservice.repository", considerNestedRepositories = true)
public class SpringMongoConfiguration 

    @Bean
    public MongoTemplate mongoTemplate() throws Exception 
        return new MongoTemplate(new MongoClient("<my_host>"), "SHAM");
    

现在我在启动时没有失败就得到了这个堆栈跟踪,看起来用户开发没有权限连接:

Caused by: com.mongodb.MongoCommandException: Command failed with error 18: 'Authentication failed.' on server phelbwlabect003.karmalab.net:27017. The full response is  "ok" : 0.0, "errmsg" : "Authentication failed.", "code" : 18, "codeName" : "AuthenticationFailed" 
    at com.mongodb.connection.CommandHelper.createCommandFailureException(CommandHelper.java:170)
    at com.mongodb.connection.CommandHelper.receiveCommandResult(CommandHelper.java:123)
    at com.mongodb.connection.CommandHelper.executeCommand(CommandHelper.java:32)
    at com.mongodb.connection.SaslAuthenticator.sendSaslStart(SaslAuthenticator.java:117)
    at com.mongodb.connection.SaslAuthenticator.access$000(SaslAuthenticator.java:37)
    at com.mongodb.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:50)
    ... 9 common frames omitted

【问题讨论】:

在我的情况下,application.properties 文件中设置了一个活动配置文件。当我在application.properties 中设置spring.data.mongodb.host 等时,此配置文件设置了spring.data.mongodb.uri 【参考方案1】:

您将 uri 样式连接设置与单个属性样式设置混合在一起。

任意使用

spring:
    data:
        mongodb:
            host: localhost
            port: 27017
            database: SHAM_TEST 
            username: develop
            password: pass

或者

spring:
    data:
        mongodb:
            uri:mongodb://develop:pass@localhost:27017/SHAM_TEST

【讨论】:

你的开发是在SHAM数据库中创建的吗?我在您的代码中看到了 SHAM 和 SHAM_TEST。 你能去 SHAM 数据库吗?运行 1. use SHAM 2. db.getUsers() 以检查您的用户是否在那里。 没有用户。 可以添加用户吗? 1.use SHAM 2.db.createUser( user: "develop", pwd: "passcode", roles: [ role: "readWrite", db: "SHAM" ] ) 3.重启mongod服务器 我已经重启了mongodb服务。什么也没有变。我仍然有同样的问题。【参考方案2】:

问题是缺少身份验证数据库。

现在是工作配置:

spring:
  data:
    mongodb:
      host: <my_host>
      username: develop
      password: d3VeL0p$
      port: 27017
      database: SHAM
      repositories:
        enabled: true
      authentication-database: admin

【讨论】:

ty,我错过了这个:authentication-database: admin【参考方案3】:

如果您使用application.properties 文件来存储您的配置,请使用以下结构。

spring.data.mongodb.host = localhost
spring.data.mongodb.port = 27017
spring.data.mongodb.database = SHAM_TEST
spring.data.mongodb.username = develop
spring.data.mongodb.password = pass

【讨论】:

【参考方案4】:

如果您的项目有多个 application.properties/application.yml 文件,有时如果一个有 URI 而另一个有 Host/Port/Credential,它们会发生冲突。

这会导致错误“无效的 mongo 配置,必须指定 uri 或主机/端口/凭据”

为避免冲突,请务必使用 URI 或 Host/Port/Credential。

【讨论】:

如果您尝试使用 Spring Boot 环境变量覆盖 application.yml 文件,这一点尤其重要。您不能以这种方式从 uri 切换到 Host/Port/Credential!选择一种方法并保持一致。【参考方案5】:

这个问题出现在 mongo 版本 4.x 中, spring 或 spring boot 仅支持 2.x 版本,因此当我们尝试连接 mongo 4 时会出现此错误:

将 mongo 从 4.x 降级到 3.x 或更低版本。

如果不是,则更改这些占位符。

更改自:

spring.data.mongodb.host= localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database= your db name
spring.data.mongodb.username= something
spring.data.mongodb.password= ***

-到-

mongo.replica.hosts=localhost:27017
mongo.dbname= your db name
mongo.username= something
mongo.password= ***

【讨论】:

以上是关于mongo 配置无效,必须指定 uri 或 host/port/credentials的主要内容,如果未能解决你的问题,请参考以下文章

UriFormatException:无效的URI:指定的端口无效

提供了无效的请求URI。 (堆栈跟踪中没有有用的信息)

在 Amazon ApiGateway 中为 URI 指定的 HTTP 终端节点无效

错误:无效参数:在 URI 文件中未指定主机:///null

nginx配置location [=|~|~*|^~] /uri/ { … }用法

无效参数:在 URI 文件中未指定主机:///null