我尝试使用spring boot来使用反应模式REST服务。我已经设置了代码,并且它正在保存Cassandara数据库中的项目。现在我有以下要求以反应方式写作:
如果在数据库中找不到项目,请保存该项目。如果Item存在则抛出异常。
我一直试图弄清楚这种逻辑是如何以被动的方式进行的。由于我是这个领域的初学者,所以很难得到这个概念。以下是我的方法:
@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 :(得分: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
。