Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring boot反应式和mongodb';命令插入需要身份验证';_Java_Mongodb_Spring Boot_Spring Webflux_Spring Data Mongodb - Fatal编程技术网

Java Spring boot反应式和mongodb';命令插入需要身份验证';

Java Spring boot反应式和mongodb';命令插入需要身份验证';,java,mongodb,spring-boot,spring-webflux,spring-data-mongodb,Java,Mongodb,Spring Boot,Spring Webflux,Spring Data Mongodb,我使用SpringBoot2.3.1和webflux以及docker容器中的MongoDB创建了一个项目。项目正常启动,并使用application.properties中声明的参数在MongoDB中连接 当我尝试执行CRUD操作“insert”时,问题就出现了。将生成以下日志: 500 Server Error for HTTP POST "/configuracao" org.springframework.data.mongodb.UncategorizedMongo

我使用SpringBoot2.3.1和webflux以及docker容器中的MongoDB创建了一个项目。项目正常启动,并使用application.properties中声明的参数在MongoDB中连接

当我尝试执行CRUD操作“insert”时,问题就出现了。将生成以下日志:

500 Server Error for HTTP POST "/configuracao"

org.springframework.data.mongodb.UncategorizedMongoDbException: Command failed with error 13 (Unauthorized): 'command insert requires authentication' on server 127.0.0.1:27017. The full response is {"ok": 0.0, "errmsg": "command insert requires authentication", "code": 13, "codeName": "Unauthorized"}; nested exception is com.mongodb.MongoCommandException: Command failed with error 13 (Unauthorized): 'command insert requires authentication' on server 127.0.0.1:27017. The full response is {"ok": 0.0, "errmsg": "command insert requires authentication", "code": 13, "codeName": "Unauthorized"}
    at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:133) ~[spring-data-mongodb-3.0.1.RELEASE.jar:3.0.1.RELEASE]
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Assembly trace from producer [reactor.core.publisher.MonoError] :
    reactor.core.publisher.MonoFlatMapMany$FlatMapManyInner.onError(MonoFlatMapMany.java:247)
    com.mongodb.reactivestreams.client.internal.AbstractSubscription.onError(AbstractSubscription.java:139)
Error has been observed at the following site(s):
    |_ MonoFlatMapMany$FlatMapManyInner.onError ⇢ at com.mongodb.reactivestreams.client.internal.AbstractSubscription.onError(AbstractSubscription.java:139)
    |_                          Flux.onErrorMap ⇢ at org.springframework.data.mongodb.core.ReactiveMongoTemplate.createFlux(ReactiveMongoTemplate.java:651)
    |_                                Flux.last ⇢ at org.springframework.data.mongodb.core.ReactiveMongoTemplate.insertDocument(ReactiveMongoTemplate.java:1578)
    |_                                 Mono.map ⇢ at org.springframework.data.mongodb.core.ReactiveMongoTemplate.insertDocument(ReactiveMongoTemplate.java:1578)
    |_                             Mono.flatMap ⇢ at org.springframework.data.mongodb.core.ReactiveMongoTemplate.lambda$doInsert$35(ReactiveMongoTemplate.java:1344)
    |_                             Mono.flatMap ⇢ at org.springframework.data.mongodb.core.ReactiveMongoTemplate.doInsert(ReactiveMongoTemplate.java:1342)
    |_                                 Mono.map ⇢ at org.springframework.http.codec.json.AbstractJackson2Encoder.encode(AbstractJackson2Encoder.java:120)
    |_                                Mono.flux ⇢ at org.springframework.http.codec.json.AbstractJackson2Encoder.encode(AbstractJackson2Encoder.java:121)
    |_                       Flux.singleOrEmpty ⇢ at org.springframework.http.codec.EncoderHttpMessageWriter.write(EncoderHttpMessageWriter.java:121)
    |_                       Mono.switchIfEmpty ⇢ at org.springframework.http.codec.EncoderHttpMessageWriter.write(EncoderHttpMessageWriter.java:122)
    |_                             Mono.flatMap ⇢ at org.springframework.http.codec.EncoderHttpMessageWriter.write(EncoderHttpMessageWriter.java:126)
    |_                               checkpoint ⇢ Handler br.com.example.exampleapplication.controller.ConfiguracaoController#save(Configuracao) [DispatcherHandler]
    |_                             Mono.flatMap ⇢ at org.springframework.web.reactive.DispatcherHandler.lambda$handleResult$5(DispatcherHandler.java:172)
    |_                       Mono.onErrorResume ⇢ at org.springframework.web.reactive.DispatcherHandler.handleResult(DispatcherHandler.java:171)
    |_                             Mono.flatMap ⇢ at org.springframework.web.reactive.DispatcherHandler.handle(DispatcherHandler.java:147)
    |_                               Mono.defer ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.filter(DefaultWebFilterChain.java:119)
    |_                         Mono.doOnSuccess ⇢ at org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter.filter(MetricsWebFilter.java:78)
    |_                           Mono.doOnError ⇢ at org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter.filter(MetricsWebFilter.java:79)
    |_                   Mono.transformDeferred ⇢ at org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter.filter(MetricsWebFilter.java:73)
    |_                               checkpoint ⇢ org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter [DefaultWebFilterChain]
    |_                               Mono.defer ⇢ at org.springframework.web.server.handler.DefaultWebFilterChain.filter(DefaultWebFilterChain.java:119)
    |_                               Mono.error ⇢ at org.springframework.web.server.handler.ExceptionHandlingWebHandler$CheckpointInsertingHandler.handle(ExceptionHandlingWebHandler.java:98)
    |_                               checkpoint ⇢ HTTP POST "/configuracao" [ExceptionHandlingWebHandler]
    |_                       Mono.onErrorResume ⇢ at org.springframework.web.server.handler.ExceptionHandlingWebHandler.handle(ExceptionHandlingWebHandler.java:77)
阅读本文,我按照建议为mongodb配置创建了一个自定义Bean:

@Configuration
@EnableTransactionManagement
@EnableReactiveMongoRepositories
public class MongoConfiguration extends AbstractReactiveMongoConfiguration {

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

    @Bean
    public MongoClient mongoClient() {
        return MongoClients.create("mongodb://exampleapp:example@localhost:27017/exampledb");
    }

//    @Bean
//    public ReactiveMongoDatabaseFactory reactiveMongoDatabaseFactory() {
//        return new SimpleReactiveMongoDatabaseFactory(MongoClients.create("mongodb://exampleapp:example@localhost:27017/exampledb"), database);
//    }

    @Override
    protected String getDatabaseName() {
        return database;
    }
我尝试使用MongoClient和ReactiveMongoDatabaseFactory,但无法执行save方法。始终返回“命令插入需要身份验证”

对于docker容器,我使用以下脚本在容器启动后初始化数据库:

db.auth('mongoadmin', 'mongoadmin')
db = db.getSiblingDB('exampledb')
db.createUser(
    {
        user: "exampleapp",
        pwd: "example",
        roles: [
            {
                role: "readWrite",
                db: "exampledb"
            }
        ]
    }
)
应用程序在启动时成功连接,我可以使用mongo express或其他gui工具连接数据库

我做错了什么?我如何配置这个spring boot反应式应用程序以适当地与mongodb集成


提前感谢。

以防您仍有此问题。我遇到了一个类似的问题,并通过使用reactiveMongoClient()而不是mongoClient()解决了它

替换:

 @Bean
public MongoClient mongoClient() {
    return MongoClients.create("mongodb://exampleapp:example@localhost:27017/exampledb");
}
与:

您的bean应该如下所示:

@EnableReactiveMongoRepositories
@Slf4j
public class MongoDBCConfig extends 
AbstractReactiveMongoConfiguration {

@Override
protected String getDatabaseName() {
    return "dbname";
}

@Override
public MongoClient reactiveMongoClient() {
    return MongoClients.create("mongodb://username:password@localhost:27017/authSource=auth-source");
    }
}

在properties/yaml文件spring.data.mongodb.uri=spring.data.mongodb.uri中应该有这样的属性=mongodb://root:root@localhost:27017/test也可以执行读取操作吗?MongoDB auto configure将为您设置客户端。@DhruvG感谢您的回复,并对长时间的响应表示抱歉。我删除了mongoClient方法,让spring实例化客户端,我在application.properties中添加了uri属性,就像您的示例一样。在此之后,错误发生了变化。现在是:由:com.mongodb.MongoSecurityException:验证MongoCredential{mechanism=SCRAM-SHA-256,userName='exampleapp',source='exampledb',password=,mechanismProperties=}的异常引起;我做了其他更改,在docker compose上添加了“命令:”--bind_ip_all“以允许其他请求来源。谢谢您的回复。正如@DhruvG所建议的,我删除了客户机实例化,让spring自动配置它。如果没有启用mongodb身份验证,则可以很好地工作,但是,如果启用了mongodb身份验证,则spring引导会在启动时连接,但在尝试执行插入时失败。你是如何使用reactiveMongoClient()进行配置的?老兄,你太棒了!事实上,这项工作花了一周的时间,经过几次失败的尝试,现在终于成功了。
@EnableReactiveMongoRepositories
@Slf4j
public class MongoDBCConfig extends 
AbstractReactiveMongoConfiguration {

@Override
protected String getDatabaseName() {
    return "dbname";
}

@Override
public MongoClient reactiveMongoClient() {
    return MongoClients.create("mongodb://username:password@localhost:27017/authSource=auth-source");
    }
}