无效的Mongo配置,必须指定uri或host/port/credentials。

7
我得到了这个异常:
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");
    }
}

现在启动时没有失败,但是出现了以下堆栈跟踪,看起来用户develop没有连接的权限:

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 文件中设置了一个活动配置文件。该配置文件设置了 spring.data.mongodb.uri,而我正在 application.properties 中设置 spring.data.mongodb.host 等内容。 - rocksteady
5个回答

21
你正在混合使用uri风格的连接设置和单独属性风格的设置。
要么使用 mongodb+srv 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两个。 - s7vr
你可以添加一个用户吗?1. use SHAM 2. db.createUser( { user: "develop", pwd: "passcode", roles: [ { role: "readWrite", db: "SHAM" } ] } ) 和 3. 重新启动mongod服务器。 - s7vr
我已经重新启动了mongodb服务。但是仍然没有改变。我仍然面临同样的问题。 - Sofiane
在第二种情况下,如果您没有用户名或密码怎么办? - rajeev pani..
谢谢,这也解决了我的问题。可以使用URI样式或单独的属性。 - Waqas Ahmed
显示剩余4条评论

10

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

这将导致错误“无效的mongo配置,必须指定uri或host/port/credentials”

为避免冲突,请确保在所有文件中使用URI或Host/Port/Credential之一。


2
如果您正在尝试使用Spring Boot环境变量覆盖application.yml文件,这一点尤其重要。您不能通过这种方式从uri切换到Host/Port/Credential!选择一种方法并保持一致。 - David I.

6
问题出在认证数据库缺失。
以下为现在正常工作的配置:
spring:
  data:
    mongodb:
      host: <my_host>
      username: develop
      password: d3VeL0p$
      port: 27017
      database: SHAM
      repositories:
        enabled: true
      authentication-database: admin

谢谢,我之前漏掉了这个:authentication-database: admin - Rea Teria

4
如果您正在使用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

1

这个问题出现在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= ***

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接