【问题标题】:Spring Webflux Non-Blocking Dependent Resource CallsSpring Webflux 非阻塞依赖资源调用
【发布时间】:2020-09-18 15:40:15
【问题描述】:

我正在使用 Spring Webflux 和 Spring Data MongoDB Reactive。 在我的 REST 控制器中,我试图从数据库(MongoDB)中获取一种类型的所有对象(例如一个品牌的所有自行车)。 我当前的实现如下所示:

@GetMapping("/bybrand/{brandId}")
public Flux<Bike> bikesByBrand(@PathVariable(value = "brandId") String brandId) {
    return bikeRepository.findByBrand( //returns a Flux<Bike>
            brandRepository.findById(brandId) //returns a Mono<Brand>
                    .block() //returns a Brand
    );
}

为了保持反应模式,我想避免 block() 调用。我尝试了 map() 和 doOnSuccess() 的多种组合,但没有找到正确的方法来做我想做的事。 我在网上找到的示例或教程没有涵盖使用依赖调用数据库的用例。 如何避免在此处使用 block() 以及使用依赖的先前调用访问数据库的黄金标准是什么?

我的另一种方法如下。

brandRepository.findById(brandId)
            .doOnSuccess(brand -> bikeRepository.findByBrand(brand));

但是我找不到最终在上级方法中返回 lambda 函数(自行车的通量)的结果的方法。

【问题讨论】:

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


    【解决方案1】:

    你可以使用 flatMapMany

    return brandRepository.findById(brandId).flatMapMany(bikeRepository::findByBrand)
    

    【讨论】:

    • 谢谢,成功了!如果我需要做更多这样的连续电话,你能提供一个例子吗?我会做类似brandRepository.findById(brandId).flatMapMany(...).flatMapMany(...)之类的事情吗?
    • 是的,如果从 Mono 转换为 Flux,则只需要 flatMapMany,否则只需使用 flatMap
    猜你喜欢
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2019-07-18
    • 2019-09-25
    • 1970-01-01
    • 2020-03-06
    • 2018-06-09
    • 2014-03-23
    相关资源
    最近更新 更多