如何从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
相关产品推荐
相关产品推荐

