如何在Spring Web Flux中使用@ExceptionHandler注解?
Spring WebFlux中@ExceptionHandler的异常传播陷阱
你遇到的这个问题,正好戳中了Spring Web(Servlet栈)和WebFlux(响应式栈)在异常处理逻辑上的核心差异。
在传统Spring Web里,@ExceptionHandler之所以好用,是因为整个请求处理流程都在同一个线程中完成——控制器方法抛出的异常能直接被注解对应的处理器捕获,逻辑非常直接。
但WebFlux的响应式模型完全不一样:响应式流的执行是异步非阻塞的,大部分业务逻辑会被调度到专门的线程池(比如Reactor的parallel()线程)去执行,而原本调用控制器方法的线程早就完成了它的任务并返回了。这种线程分离的设计,就导致异步流里抛出的异常根本没办法自动传播回控制器的线程,自然也就没法被你原来写的@ExceptionHandler拦截处理。
我当初第一次在WebFlux里用@ExceptionHandler时也踩过这个坑,一开始以为和Servlet栈一样直接用就行,结果发现异步操作里的异常完全没被处理,查了半天资料才搞清楚是线程模型的问题在搞鬼。
如果要在WebFlux里正确处理这类异常,给你几个实用的方向:
- 在响应式流的操作链中直接用
onErrorResume、onErrorReturn这类操作符,在异常发生时直接转换为合法的响应对象 - 自定义全局的
ErrorWebExceptionHandler实现,这是WebFlux官方推荐的全局异常处理方案,能统一拦截所有请求的异常 - 要是想保留
@ExceptionHandler的写法,可以结合@ControllerAdvice,但要确保异常是在控制器方法返回的响应式流上下文内被抛出并正确传递的
内容的提问来源于stack exchange,提问作者Evgen
相关产品推荐
相关产品推荐

