HandlerExceptionResolver 是 Spring Boot 全局异常处理的底层核心接口,通过责任链机制统一拦截 Controller 异常;需实现 resolveException 方法并用 @Order 控制优先级,可自定义视图跳转、JSON 响应或 sendError,但不处理 Filter/Interceptor/异步异常。

在 Spring Boot 全局异常处理中,HandlerExceptionResolver 是底层核心接口,用于统一拦截并响应 Controller 层抛出的异常。它不依赖注解,而是通过 Spring MVC 的责任链机制,在 DispatcherServlet 捕获异常后逐个调用已注册的解析器。自定义实现它,适合需要完全掌控异常流向(比如统一跳转视图、写入日志、修改响应状态码或直接 sendError)的场景。
实现 HandlerExceptionResolver 接口
创建一个类实现 HandlerExceptionResolver 接口,重写 resolveException 方法:
- 方法参数包含 request、response、handler(当前执行的 Controller 方法)、实际抛出的 exception
- 返回
ModelAndView表示要渲染的视图(如 Thymeleaf 页面),返回null表示不处理,交由下一个解析器;返回空new ModelAndView()表示已处理但不渲染视图(常用于 JSON 响应或 sendError) - 注意:该方法内可直接操作
HttpServletResponse,例如调用response.sendError(400, "xxx"),此时会触发 Spring 的/error流程(除非你禁用了 BasicErrorController)
注入容器并控制优先级
Spring Boot 默认注册了多个 HandlerExceptionResolver 实现(如 ExceptionHandlerExceptionResolver、ResponseStatusExceptionResolver),它们按顺序执行。你的自定义解析器默认优先级最低 —— 也就是最后才轮到它。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
@Component或@Configuration + @Bean注册你的解析器 - 必须添加
@Order注解明确优先级,例如:@Order(Ordered.HIGHEST_PRECEDENCE)(数字越小越靠前) - 若想让它覆盖所有异常(包括参数校验失败、类型转换异常等),建议设为最高优先级;若只兜底未被其他解析器捕获的异常,可设为较低优先级
配合视图或 JSON 响应使用
根据项目是否启用模板引擎(如 Thymeleaf),处理方式不同:
- 用 Thymeleaf:在
resolveException中设置mv.setViewName("error1"),对应resources/templates/error1.html,并通过mv.addObject("error", ex.getMessage())传参 - 返回统一 JSON:不设 viewName,而是手动设置 response 内容类型为
application/json,写入序列化后的结果(如 Jackson),并返回null或空ModelAndView - 注意:如果同时存在
@RestControllerAdvice,且它的@ExceptionHandler方法能匹配当前异常,则它会先于你的HandlerExceptionResolver执行(前提是你的解析器优先级没设得更高)
常见误区提醒
几个容易踩坑的地方:
-
resolveException方法里不要抛出新异常,否则可能造成二次异常或无限循环 - 若在方法中调用了
response.sendError(),后续不会再进入其他HandlerExceptionResolver,但会触发 Spring 的BasicErrorController处理/error请求 —— 除非你显式禁用或替换它 - 它无法处理 Filter、Interceptor 或异步线程(如
@Async)中抛出的异常,那些需要额外机制(如AsyncUncaughtExceptionHandler) - Spring Boot 2.3+ 默认禁用了
BasicErrorController的白页,若要保留自定义错误页,需确保配置server.error.whitelabel.enabled=true或提供自己的ErrorController

















