【问题标题】:Cannot convert from List<Mono<BOLCompliance>> to List<BOLCompliance>无法从 List<Mono<BOLCompliance>> 转换为 List<BOLCompliance>
【发布时间】:2021-10-13 08:13:04
【问题描述】:

我有一个方法 createComplianceResponse() 返回 BOLCompliance 对象,在此之前我更改为 BOLCompliance 的 Mono,因为我必须在其中调用另一个反应式服务。 但是在这样做之后,我正在调用该服务的当前服务在第 6 行和第 7 行出现错误。

1) Cannot convert from Mono<Object> to Mono<List<BOLCompliance>>
2) Cannot convert from List<Mono<BOLCompliance>> to List<BOLCompliance>
    private Mono<List<BOLCompliance>> getComplienceRouteLink(BOLRouteLink routeLink, BillOfLadingResponse bol) {
        if (null != routeLink.getComplianceIds() && !routeLink.getComplianceIds().isEmpty()) {
            Mono<List<Compliance>> complianceList = Flux
                    .fromIterable(routeLink.getComplianceIds()).flatMap(cmp ->
                            complianceCaller.getComplianceById(cmp)).collectList();
            return complianceList.flatMap(compliancesOld -> {
                List<BOLCompliance> complianceResponses = compliancesOld.parallelStream()
                        .map(compliance -> createComplianceResponse(compliance,bol)
                        ).collect(Collectors.toList());
                return Mono.just(complianceResponses);
            });
        }

我更改了返回类型的其他服务是

private Mono<BOLCompliance> createComplianceResponse(Compliance compliance, BillOfLadingResponse bol);

【问题讨论】:

  • 你把事情搞混了,我会说。您在那里有一个 parellelStream,暗示您要并行化 createComplianceResponse。我认为您应该尝试生成 Flux 而不是 Mono>,省略 parallelStream,并仅映射到 createComplianceResponse()。这应该会产生 Flux,并且也是可并行化的。

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


【解决方案1】:

请看一下这个,它可以代替你的代码:

private Flux<BOLCompliance> getComplienceRouteLink(BOLRouteLink routeLink, BillOfLadingResponse bol) {
    return Mono.justOrEmpty(routeLink.getComplianceIds())
        .flatMapMany(Flux::fromIterable)
        .flatMap(id -> complianceCaller.getComplianceById(id))
        .flatMap(compliance -> createComplianceResponse(compliance, bol));
}

而不是返回 Mono&lt;List&lt;Something&gt;&gt; 您返回 Flux&lt;Something&gt; 并且可以并行化。同样重要的是要知道,什么调用可能需要更长的时间,并且需要在另一个线程池上调度,以进行并行化。您可以通过在另一个线程池上轻松调度来扩展此 Flux 创建。

【讨论】:

  • 我得到:无法在您提供的解决方案的第 2 行从 Flux 转换为 Flux。 return Mono.justOrEmpty(routeLink.getComplianceIds())
  • 谢谢,我可以使用 flatMap() 而不是 map() 来修复错误
  • 在您的代码中还是在我的代码中?如果可能,我想修复我的代码 sn-p。
  • 你的不是我的,是的,请修复它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 2013-06-12
  • 1970-01-01
  • 2013-06-02
相关资源
最近更新 更多