反应式编程如何实现依赖结果

时间:2018-05-15 13:19:39

标签: spring reactive-programming spring-webflux project-reactor

我尝试使用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());
}

如何以反应方式将这两者结合起来?

1 个答案:

答案 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