Как использовать возвращаемый объект Mono без использования block ()? - PullRequest
1 голос
/ 21 апреля 2020

Я пытаюсь научиться весеннему 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()?

Ответы [ 3 ]

1 голос
/ 21 апреля 2020

Вы можете попробовать что-то вроде этого

public Mono<Category> getCategories(Category category) {
   return repository.findByName(category.getName()).doOnNext(o -> {
   }).switchIfEmpty(repository.save(category));
}
1 голос
/ 21 апреля 2020

Используйте Mono::switchIfEmpty, который предоставляет альтернативу Mono в случае, если предыдущий заполнен без данных. Пока ReactiveMongoRepository::save возвращает Mono, вы можете передать его для генерации альтернативного.

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

В случае, если ReactiveMongoRepository::findById вернет Mono с данными, Mono::switchIfEmpty не будет вызываемый.

Редактировать: Использование Mono::defer с Supplier<Mono> делает операцию сохранения отложенной при необходимости:

.switchIfEmpty(Mono.defer(() -> repository.save(new Category(category.getName()))));
0 голосов
/ 21 апреля 2020

Вам нужно отложить switchIfEmpty. В противном случае он будет запущен с нетерпением:

return repository.findById(category.getId())
                 .switchIfEmpty(Mono.defer(() ->respository.save(category)));
...