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

WebClient配置ExchangeFilter抛自定义异常仍返回默认错误格式如何解决

问题排查与解决方案

存在的问题

  • 自定义异常MyException定义不完整:你在过滤器中调用双参数构造方法new MyException(code, message),但现有代码中只有单字符串参数的构造方法,且没有为自定义的code字段添加getter方法,序列化时无法正常读取字段值。另外MyException继承自Exception属于受检异常,在响应式链路中传播需要额外处理,不如运行时异常使用便捷。
  • 没有配置全局异常捕获逻辑:你只在WebClient过滤器中抛出了自定义异常,但Spring没有对应的处理器来处理该异常,默认会走内置的异常处理逻辑,返回你看到的带timestamp的默认错误结构。

修复步骤

1. 修正自定义异常类

// 改为继承RuntimeException,属于非受检异常,更适配响应式链路传播
public class MyException extends RuntimeException{
    private int code;

    // 补充双参数构造方法
    public MyException(int code, String message) {
        super(message);
        this.code = code;
    }

    // 添加getter方法,保证序列化时可以正常读取字段
    public int getCode() {
        return code;
    }
}

2. 添加全局异常处理器

添加@RestControllerAdvice注解的全局异常处理类,统一捕获MyException并返回指定格式的响应:

import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import reactor.core.publisher.Mono;

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MyException.class)
    public Mono<CustomError> handleMyException(MyException e) {
        return Mono.just(new CustomError(String.valueOf(e.getCode()), e.getMessage()));
    }

    // 定义返回的响应结构
    public static class CustomError {
        private String code;
        private String message;

        public CustomError(String code, String message) {
            this.code = code;
            this.message = message;
        }

        // 必须添加getter方法
        public String getCode() {
            return code;
        }

        public String getMessage() {
            return message;
        }
    }
}

3. 额外检查项

确认你在调用WebClient的代码中,通过retrieve()或者exchange()处理响应后,没有用onErrorResume、onErrorReturn等操作吞掉了抛出的MyException,保证异常可以正常传播到Controller层被全局处理器捕获。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:09:03