如何在不使用 block() 的情况下使用 Mono 的 return 对象?
How to use return object of Mono without using block()?
我正在努力学习 spring webflux。在 ReactiveMongoRepository
中,我正在尝试检查类别是否已存在。如果它已经存在,则 return 否则保存该对象并 return 新保存的对象。像下面这样的东西。
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()
来执行此操作?
使用 Mono::switchIfEmpty
提供替代方案 Mono
以防前一个在没有数据的情况下完成。只要ReactiveMongoRepository::save
returnsMono
就可以通过生成备选的
return repository.findById(category.getId())
.switchIfEmpty(repository.save(new Category(category.getName())));
如果ReactiveMongoRepository::findById
returns一个Mono
有数据,Mono::switchIfEmpty
将不会被调用。
编辑: 将 Mono::defer
与 Supplier<Mono>
结合使用可在必要时延迟保存操作:
.switchIfEmpty(Mono.defer(() -> repository.save(new Category(category.getName()))));
你可以试试这样的
public Mono<Category> getCategories(Category category) {
return repository.findByName(category.getName()).doOnNext(o -> {
}).switchIfEmpty(repository.save(category));
}
您需要推迟 switchIfEmpty
。否则会急切触发:
return repository.findById(category.getId())
.switchIfEmpty(Mono.defer(() ->respository.save(category)));
我正在努力学习 spring webflux。在 ReactiveMongoRepository
中,我正在尝试检查类别是否已存在。如果它已经存在,则 return 否则保存该对象并 return 新保存的对象。像下面这样的东西。
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()
来执行此操作?
使用 Mono::switchIfEmpty
提供替代方案 Mono
以防前一个在没有数据的情况下完成。只要ReactiveMongoRepository::save
returnsMono
就可以通过生成备选的
return repository.findById(category.getId())
.switchIfEmpty(repository.save(new Category(category.getName())));
如果ReactiveMongoRepository::findById
returns一个Mono
有数据,Mono::switchIfEmpty
将不会被调用。
编辑: 将 Mono::defer
与 Supplier<Mono>
结合使用可在必要时延迟保存操作:
.switchIfEmpty(Mono.defer(() -> repository.save(new Category(category.getName()))));
你可以试试这样的
public Mono<Category> getCategories(Category category) {
return repository.findByName(category.getName()).doOnNext(o -> {
}).switchIfEmpty(repository.save(category));
}
您需要推迟 switchIfEmpty
。否则会急切触发:
return repository.findById(category.getId())
.switchIfEmpty(Mono.defer(() ->respository.save(category)));