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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:00:33