Реактивное программирование, как реализовать зависимый результат - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь использовать реактивный 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());
}

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

1 Ответ

0 голосов
/ 15 мая 2018

Просто проверьте результат 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.

...