WebFlux如何以功能非阻塞方式链接查询

时间:2019-07-18 05:55:18

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

我是函数范式的新手,想知道如何在创建新对象之前进行一些查询?

@Override
public Mono<Order> create(CreateOrderRequest specs) {

    //itemRepository.findAll(specs.getItemCodes()) //returns Flux<Item>


    final Order newOrder = new Order(items);
    return orderRepository.insert(newOrder)
            .switchIfEmpty(Mono.error(new ResponseStatusException(HttpStatus.BAD_REQUEST, "Failed to create order")));
}

如何以非阻塞方式链接注释的代码?查询返回Flux<Item>,而Order构造函数需要List<Item>

1 个答案:

答案 0 :(得分:1)

您可以使用collectList()方法,该方法会将Flux<Item>更改为Mono<List<Item>>

之后,您可以使用map()方法将List<Item>转换为Order对象,并使用flatMap()方法来获取保存的结果。

例如:

return itemRepository
    .findAll(specs.getItemCodes())
    .collectList()
    .map(Order::new)
    .flatMap(orderRepository::insert)
    .switchIfEmpty(Mono.error(new ResponseStatusException(HttpStatus.BAD_REQUEST, "Failed to create order")));