首页 > 解决方案 > 如何在不使用 block() 的情况下使用 Mono 的返回对象?

问题描述

我正在尝试学习spring webflux。在ReactiveMongoRepository,我正在尝试检查类别是否已经存在。如果它已经存在,则返回该对象,否则保存并返回新保存的对象。类似于以下的东西。

public Mono<Category> save(Category category) {
    final Mono<Category> byId = repository.findById(category.getId());
    final Category block = byId.block();
    if (block == null) {
        return repository.save(new Category(category.getName()));
    } else {
        return byId;
    }
}

我怎么能不使用来做到这一点block()

标签: javaspringspring-bootspring-webfluxproject-reactor

解决方案


如果前一个在没有数据的情况下完成,则使用Mono::switchIfEmpty它提供了一种替代方法。Mono只要ReactiveMongoRepository::save返回Mono,就可以通过它来生成替代的。

return repository.findById(category.getId())
                 .switchIfEmpty(repository.save(new Category(category.getName())));

如果ReactiveMongoRepository::findById返回Mono带有数据的 a,Mono::switchIfEmpty则不会调用。

编辑:Mono::defer与 a 一起使用会使Supplier<Mono>保存操作在必要时延迟:

.switchIfEmpty(Mono.defer(() -> repository.save(new Category(category.getName()))));

推荐阅读