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

WebFlux How to Chain Queries In Functional Non Blocking Way

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

@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")));
}

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

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

之后,您可以使用map() method to convert your List<Item> into an Order object, and the 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")));