Spring Boot Reactive Java应用@RestControllerAdvice不生效问题咨询
Spring Boot Reactive 全局异常处理器未触发排查方案
常见原因及解决方法
- 全局异常处理器未被Spring容器扫描到
确认RestExceptionHandler类所在的包路径在Spring Boot启动类的默认扫描范围内(即启动类所在包及其子包),如果不在需要在启动类上通过@ComponentScan注解手动配置扫描路径。可以在RestExceptionHandler类中添加@PostConstruct注解的初始化方法打印日志,确认类是否被成功加载。 - 异常未封装到反应式流的错误信号中
WebFlux的全局异常处理器仅能捕获反应式流管道中传播的异常,必须通过return Mono.error(new RequestValidationException("提示信息"))或者return Flux.error(...)的方式抛出异常。如果是在反应式流外的独立线程、普通工具类中直接throw new RequestValidationException(),异常不会被反应式上下文捕获,也就无法触发全局异常处理。 - 自定义异常被上层操作符拦截转换
检查抛出异常的上游链路是否使用了onErrorResume、onErrorContinue、doOnError等操作符捕获了异常,没有向下游传递;或者是否存在AOP切面、全局拦截器将RequestValidationException转换成了其他类型的异常,导致@ExceptionHandler的类型匹配失败。可以临时在全局异常处理器中添加一个处理Exception.class的通用方法,打印捕获到的异常类型,确认是否发生了类型转换。 - 自定义ErrorWebExceptionHandler覆盖了默认处理逻辑
如果你项目中自定义实现了ErrorWebExceptionHandler接口,并且设置了更高的优先级(比如添加了@Order(Ordered.HIGHEST_PRECEDENCE)注解),会优先走自定义的异常处理逻辑,导致@RestControllerAdvice标注的全局异常处理器失效。可以临时注释掉自定义的ErrorWebExceptionHandler实现验证是否是该原因导致。 - 异常在过滤器链中抛出未到Controller层
@RestControllerAdvice仅处理Controller层抛出的异常,如果你的异常是在WebFilter、Spring Security过滤器链等前置链路中抛出的,不会被该处理器捕获,需要在对应过滤器的异常处理逻辑中自行处理。 - 注解导包错误
确认@RestControllerAdvice、@ExceptionHandler、@ResponseStatus等注解都是导入的org.springframework.web.bind.annotation包下的对应类,导错包会导致注解不生效。
内容的提问来源于stack exchange,提问作者nehacharya
相关产品推荐
相关产品推荐

