如何在Mono为空时将实体对应字段赋值为null并返回?
实现方案
方案1:使用defaultIfEmpty统一处理(推荐)
先给空流填充null默认值,再统一做字段赋值,逻辑更聚合:
return externalClient.getExternalId() // 空流时主动发射null值,保证map一定会被执行 .defaultIfEmpty(null) .map(id -> { entity.setExternalId(id); return entity; });
如果需要同时覆盖外部服务不可用抛出异常的场景,补充错误处理逻辑即可:
return externalClient.getExternalId() // 捕获调用异常,转为空流后续统一处理 .onErrorResume(e -> Mono.empty()) .defaultIfEmpty(null) .map(id -> { entity.setExternalId(id); return entity; });
方案2:使用switchIfEmpty分支处理
分开实现有值、空流的赋值逻辑,适合两种场景逻辑差异较大的情况:
return externalClient.getExternalId() .map(id -> { entity.setExternalId(id); return entity; }) // 流为空时走分支逻辑赋值null .switchIfEmpty(Mono.fromCallable(() -> { entity.setExternalId(null); return entity; }));
原理解释
defaultIfEmpty(null):上游Mono没有发射任何元素就结束时,会主动向下游发射一个null值,保证后续的map算子一定会被触发。onErrorResume:捕获上游调用抛出的所有异常,转为自定义的空流,避免异常直接抛出导致赋值逻辑不执行。switchIfEmpty:上游为空时切换到传入的备选Mono执行,实现分支逻辑隔离。
内容的提问来源于stack exchange,提问作者Melad Basilius
相关产品推荐
相关产品推荐

