Spring全局异常处理器仅记录日志后移交处理却无法触发的问题
全局异常处理器未触发问题排查与解决
问题描述
需要实现一个全局异常处理器,仅记录异常请求数据及少量信息后,将异常交回应用常规异常流程处理。已实现以下代码,但处理器从未触发(添加sysout语句也无输出):
@Order(Ordered.HIGHEST_PRECEDENCE) @Slf4j @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public void handleException(HttpServletRequest request, Exception ex) throws Exception { log.error("[ERROR]: {}, Route: {}, Method: {}, Data sent: {}", ex.getMessage(), request.getRequestURL().toString(), request.getMethod(), request.getParameterMap().toString()); throw ex; } }
可能原因及解决方案
1. 组件未被Spring扫描加载
如果GlobalExceptionHandler所在的包不在Spring Boot的组件扫描范围内,该类不会被实例化,自然无法生效。
- 解决方式:
- 将
GlobalExceptionHandler移到主应用类(标注@SpringBootApplication的类)的子包下; - 或者在
@SpringBootApplication上显式指定扫描路径:@SpringBootApplication(scanBasePackages = {"com.your.main.package", "com.your.exception.handler.package"}) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
- 将
2. 异常不在Spring MVC处理链中抛出
@ControllerAdvice只能捕获DispatcherServlet处理范围内的异常,比如Controller方法、ControllerAdvice内部抛出的异常。如果异常在Filter、Interceptor等前置组件中抛出,该处理器无法捕获。
- 解决方式:
- 针对Filter中的异常,需自定义Filter捕获并记录,再抛出或转发到错误处理节点;
- 先在Controller中主动抛出异常测试,比如:
@RestController public class TestController { @GetMapping("/test-exception") public String triggerException() throws Exception { throw new RuntimeException("测试触发异常"); } }
3. 方法签名或注解配置问题
- 检查
@Order注解的导入是否正确,需使用org.springframework.core.Ordered,避免导入其他包下的同名类; - 尝试调整方法签名,添加
WebRequest参数(不影响功能,仅用于验证注入是否正常):@ExceptionHandler(Exception.class) public void handleException(HttpServletRequest request, Exception ex, WebRequest webRequest) throws Exception { log.error("[ERROR]: {}, Route: {}, Method: {}, Data sent: {}", ex.getMessage(), request.getRequestURL().toString(), request.getMethod(), request.getParameterMap().toString()); throw ex; }
4. 存在优先级更高的异常处理器
虽然配置了Ordered.HIGHEST_PRECEDENCE,但如果项目中存在其他标注@ControllerAdvice且优先级更高的处理器(比如@Order设置了更小的数值),会优先捕获异常。
- 解决方式:
- 暂时禁用项目中其他全局异常处理器,测试当前代码是否生效;
- 通过日志打印Spring加载的异常处理器顺序,确认当前处理器的优先级配置是否生效。
内容的提问来源于stack exchange,提问作者Alefi Cunha
相关产品推荐
相关产品推荐

