修改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
相关产品推荐
相关产品推荐

