【问题标题】:ReactiveMongoRepository not saving my dataReactiveMongoRepository 不保存我的数据
【发布时间】:2019-11-25 23:24:29
【问题描述】:

我是 springmongonoSQL 的菜鸟。

我已在本地连接到我的 mongoDB。

但是我试图拯救我的实体的尝试总是失败。

val a0 = myEntity(name = "my Entity")
repository.save(a0)

我的存储库扩展了ReactiveMongoRepository<MyEntity, Long>

但是当我将其更改为扩展 MongoRepository<MyEntity, Long> 时,它就可以工作了。

可能是什么问题?

我的数据库实例正在运行并且工作正常。 我猜它必须与反应性事物有关。

【问题讨论】:

    标签: database mongodb spring-boot kotlin reactor


    【解决方案1】:

    为了让您使用subscribe() 操作流式传输终端并同时获得Mono 结果 - 分为两个单独的操作:

    val a0 = myEntity(name = "my Entity");
    Mono<?> savedEntity = repository.save(a0);
    savedEntity.subscribe();
    return savedEntity;
    

    【讨论】:

      【解决方案2】:

      如果你使用响应式流,你应该知道nothing happens until you subscribe:

      在 Reactor 中,当您编写 Publisher 链时,默认情况下数据不会开始泵入其中。相反,您创建异步过程的抽象描述(这有助于可重用性和组合)。

      通过订阅的行为,您将Publisher绑定到Subscriber,从而触发整个链中的数据流。这是通过来自Subscriber 的单个请求信号在内部实现的,该信号向上游传播,一直返回到源Publisher

      这意味着如果你使用ReactiveMongoRepository,你必须订阅你的反应流。这可以通过在任何Publisher 上使用subscribe() 方法来完成。例如,使用 Java,那将是:

      reactiveRepository
          .save(myEntity)
          .subscribe(result => log.info("Entity has been saved: {}", result));
      

      此外,如果您编写反应式控制器,Webflux 等框架将为您处理订阅。使用 Java 意味着您可以编写如下内容:

      @GetMapping
      public Mono<MyEntity> save() {
          return reactiveRepository.save(myEntity); // subscribe() is done by the Webflux framework
      }
      

      显然,响应式编程的意义远不止于此,您应该意识到,如果不适应响应式生态系统和使用响应式编程,就不能简单地将 MongoRepository 交换为 ReactiveMongoRepository

      Reactor 参考指南中有一个Introduction to Reactive Programming 章节可能会很有趣。前面引用的文档也来自参考指南的这一章。

      【讨论】:

      • 但是这样你会从subscribe()得到Disposable,而存储库返回Mono。如何通过 POJO 进行保存并获取已保存实体的Mono
      • @Zon 我不明白你的问题。如果您想从代码中返回 Mono,则返回 repository.save() 调用而不调用 subscribe()。请注意,调用您的逻辑的代码最终必须在某个地方订阅。
      猜你喜欢
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多