Wie verwende ich das Rückgabeobjekt von Mono ohne block ()?
Ich versuche, Spring Webflux zu lernen. In ReactiveMongoRepository
versuche ich zu überprüfen, ob die Kategorie bereits vorhanden ist. Wenn es bereits vorhanden ist, geben Sie das Objekt zurück, andernfalls speichern Sie es und geben Sie das neue gespeicherte Objekt zurück. So etwas wie folgen.
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;
}
}
Wie kann ich das ohne verwenden block()
?
Verwendung Mono::switchIfEmpty
, die eine Alternative bietet, Mono
falls die erstere ohne Daten abgeschlossen wird. Solange ReactiveMongoRepository::save
zurückgegeben wird Mono
, können Sie es übergeben, um die alternative zu generieren.
return repository.findById(category.getId())
.switchIfEmpty(repository.save(new Category(category.getName())));
Falls ReactiveMongoRepository::findById
a Mono
mit Daten zurückgegeben wird, Mono::switchIfEmpty
wird das nicht aufgerufen.
Bearbeiten: Wenn Sie Mono::defer
mit a verwenden, Supplier<Mono>
wird der Speichervorgang bei Bedarf verzögert:
.switchIfEmpty(Mono.defer(() -> repository.save(new Category(category.getName()))));