我正在嘗試呼叫,getProductContract()但它回傳一個空串列。我認為那是因為 Mono 沒有被執行。
有人可以幫助我如何執行呼叫,以便我重新填充resultList嗎?
示例代碼
//Controller.java:
service.getProductContract()
// Service.java
public Mono<List<ProductContract>> getProductContract() {
Set<String> productIdList = new HashSet<>();
productIdList.add("p123");
productIdList.add("p456");
List<ProductContract> resultList = new ArrayList<>();
productIdList.forEach(productId -> prodRepository.getProductDetails(productId)
.flatMap(productDetail -> prodRepository.getProductContracts(productDetail.getProductContractId()))
.mapNotNull(contracts -> resultList.add(contracts.stream().findFirst().isPresent()? contracts.stream().findFirst().get():null))
.subscribeOn(Schedulers.boundedElastic())
);
log.info("size {}",String.valueOf(resultList.size())); //-> Size is ZERO
return Mono.just(resultList);
}
// Repository.java
public Mono<List<ProductContract>> getProductContracts (String contractId){...} // can return multiple contacts for 1 id
public Mono<String> getProductDetails(String productId){...}
uj5u.com熱心網友回復:
該productIdList....flapMap...塊是異步執行的,當列印中的大小時log.info,為零表示執行未完成。
在您的情況下,組合所有資源的更好方法是這樣的。
return Flux.fromIterable(productIdList)
.flatMap(productId -> prodRepository.getProductDetails(productId))
.flatMap(p-> ....getContacts)
.map(....build a contact dto instance...)
如果您想回傳 a Mono<List<ContactDto>>,只需呼叫Flux.collectList。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/341288.html
標籤:弹簧靴 弹簧-webflux
