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")));
我是函数范式的新手,想知道如何在创建新对象之前进行一些查询?
@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")));