Я пытаюсь использовать службу 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());
}
Как совместить эти два способа реактивно?
Просто проверьте результат 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.