You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改createComplianceResponse返回Mono<BOLCompliance>后类型转换错误如何解决

问题根因

你的报错本质是同步、异步逻辑混用导致的类型不匹配:createComplianceResponse修改为返回Mono<BOLCompliance>后,你用Java Stream的map操作遍历compliancesOld得到的是List<Mono<BOLCompliance>>,而非你期望的同步结果List<BOLCompliance>,自然无法直接包装为Mono.just()返回触发类型转换错误。

修正后代码

推荐直接全链路用Reactor操作符处理异步逻辑,代码更简洁也符合反应式编程规范:

private Mono<List<BOLCompliance>> getComplienceRouteLink(BOLRouteLink routeLink, BillOfLadingResponse bol) {
    if (null != routeLink.getComplianceIds() && !routeLink.getComplianceIds().isEmpty()) {
        return Flux.fromIterable(routeLink.getComplianceIds())
                .flatMap(cmp -> complianceCaller.getComplianceById(cmp))
                // 异步调用修改后的createComplianceResponse
                .flatMap(compliance -> createComplianceResponse(compliance, bol))
                // 直接收集异步结果为List,返回值天然匹配方法定义
                .collectList();
    }
    // 补充空分支返回逻辑,可根据业务需求调整返回值
    return Mono.just(Collections.emptyList());
}

可选兼容方案

如果你确实需要先拿到完整的List<Compliance>再做后续处理,也可以只修改原有逻辑的嵌套部分:

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<Compliance>转成Flux处理异步调用,再收集结果
            Flux.fromIterable(compliancesOld)
                    .flatMap(compliance -> createComplianceResponse(compliance, bol))
                    .collectList()
        );
    }
    return Mono.just(Collections.emptyList());
}

内容的提问来源于stack exchange,提问作者Mira Devi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:30:01