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

