【问题标题】:Mono returning empty list单声道返回空列表
【发布时间】:2021-10-28 02:20:12
【问题描述】:

我正在尝试调用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){...}

【问题讨论】:

    标签: spring-boot spring-webflux


    【解决方案1】:

    这个productIdList....flapMap...块是异步执行的,当打印log.info中的大小时,它为零表示执行没有完成。

    在您的案例中组装所有资源的更好方法是这样的。

    return Flux.fromIterable(productIdList)
         .flatMap(productId -> prodRepository.getProductDetails(productId))
         .flatMap(p-> ....getContacts)
         .map(....build a contact dto instance...)
         
    

    如果您想返回Mono&lt;List&lt;ContactDto&gt;&gt;,只需致电Flux.collectList

    【讨论】:

      猜你喜欢
      • 2015-12-26
      • 1970-01-01
      • 2019-08-18
      • 2021-03-11
      • 2015-10-27
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多