Spring Gateway迁移至Spring Cloud 3:Mono方法报错及修正方案咨询
Spring Cloud 3 中 Spring Gateway WebFilter 迁移解决方案
问题原因
Spring Cloud 3 依赖的 Reactor Core 版本更新后,Mono.doOnSuccessOrError(BiConsumer) 方法已被标记为过时,且部分场景下不再被支持,导致你遇到 Cannot resolve method 'doOnSuccessOrError' in 'Mono' 错误。你后续修改的代码错误在于 doOnError(ex) 未提供合法的 Consumer 实现,因此出现 Cannot resolve symbol 'ex' 报错。
正确迁移代码
方案1:使用 doOnTerminate 统一处理终止逻辑
如果你的需求是无论请求处理成功还是失败,都要执行 MDC.clear(),推荐使用 doOnTerminate,它会在 Mono 完成(成功或错误)时触发:
@Component public class CorrelationIdApiFilter implements WebFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) { if (......) { ServerWebExchange obj = ...... return chain.filter(obj).doOnTerminate(MDC::clear); } return chain.filter(exchange); } }
方案2:分开处理成功和错误回调
如果你需要分别对成功、错误场景做不同处理(当前场景下只是统一调用 MDC.clear()),可以显式使用 doOnSuccess 和 doOnError:
@Component public class CorrelationIdApiFilter implements WebFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) { if (......) { ServerWebExchange obj = ...... return chain.filter(obj) .doOnSuccess(resp -> MDC.clear()) .doOnError(ex -> MDC.clear()); } return chain.filter(exchange); } }
补充说明
doOnTerminate与doFinally的区别:doOnTerminate在 Mono 完成(成功/错误)时执行,而doFinally会在 Mono 终止的所有场景(包括取消)执行,根据你的实际需求选择即可。- 注意 Reactor 线程模型下的 MDC 上下文传递:如果你的过滤器中涉及线程切换,建议结合
Context来传递 MDC 内容,避免线程切换导致 MDC 数据丢失。
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

