Реактивное программирование как реализовать зависимый результат

Я пытаюсь использовать службу REST с реактивным шаблоном, используя весеннюю загрузку. Я установил код, и он работает над сохранением элемента в базе данных Cassandara. Теперь у меня есть следующее требование писать в реактивном режиме:

Если элемент не найден в базе данных, сохраните его. Если элемент присутствует, выбросить исключение.

Я пытался понять, как работает такая логика в реактивной манере. Поскольку я новичок в этой области, мне сложно понять концепцию. Вот мой подход:

@Override
public Mono<String> createItem(ItemCreateParam itemCreateParam) {
    //This check if item exits in database.
    Mono<Boolean> byName = reactiveItemRepository.existsById(itemCreateParam.getName());

    //This save the item and return the id (i.e name)
    return Mono.just(itemCreateParam)
            .flatMap(item -> convert(item))
            .log()
            .flatMap(t -> reactiveTemplateRepository.save(t))
            .map(t-> t.getName());
}

Как совместить эти два способа реактивно?

0
0
1 074
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто проверьте результат existsWithId(). Вот как я бы это реализовал:

@Override
public Mono<String> createItem(ItemCreateParam itemCreateParam) {
    return reactiveItemRepository.existsById(itemCreateParam.getName())
           .doOnNext(exists -> {
                if (exists) {
                     throw new AppException(ErrorCode.ITEM_EXISTS);
                }
           })
          .flatMap(exists -> convert(item))
          .flatMap(converted -> reactiveTemplateRepository.save(converted))
          .map(saved -> saved.getName());
}

Обратите внимание, что тип AppException может быть любым другим, но он должен расширять RuntimeException.

Другие вопросы по теме