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

如何从Mono提取值,返回WSDL生成接口要求的List<Attributes>类型

问题核心矛盾

你当前的接口是WSDL生成的固定同步签名,必须返回List<Attributes>,但下游调用是响应式返回Mono,这种场景下不存在完全非阻塞的实现方式:同步方法的契约要求返回时必须拿到完整结果,必然要等待响应式流处理完成,没有绕过方案。

现有代码的错误原因
  • map操作只会把Mono<UserProfile>转换为Mono<List<Attributes>>,返回值仍是Mono类型,和接口要求的List类型不匹配
  • subscribe触发订阅后返回的是Disposable对象(用于取消订阅),完全拿不到处理结果,只适合无返回值的异步场景
可直接运行的修正方案

因为接口签名无法修改,必须用block()阻塞等待Mono处理完成拿到结果,这是唯一符合要求的实现:

@Override
public List<Attributes> getUserProfile(final String filterValue) {
    return getUserProfile(serviceName, filterValue)
            .map(this::userProfileToAttributeList)
            // 阻塞等待响应式流处理完成,直接返回List结果
            .block();
}
注意事项

如果你的服务是WebFlux响应式架构,不要在NIO事件循环核心线程调用这个同步方法,避免阻塞核心线程影响整体服务性能,建议加线程切换逻辑,把阻塞操作放到专门的弹性线程池执行:

@Override
public List<Attributes> getUserProfile(final String filterValue) {
    return getUserProfile(serviceName, filterValue)
            .map(this::userProfileToAttributeList)
            // 切换到弹性线程池执行阻塞逻辑,不占用核心响应式线程
            .subscribeOn(Schedulers.boundedElastic())
            .block();
}
后续优化方向

如果后续可以调整接口定义(比如升级为响应式WebService),可以把接口返回值改为Mono<List<Attributes>>,就能去掉block()实现完全非阻塞调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:24:03