Spring MVC HandlerExceptionResolver异常解析器
HandlerExceptionResolver 负责解析控制器执行过程中抛出的异常,将其转换为 ModelAndView 或响应内容。
接口定义
Java
public interface HandlerExceptionResolver {
ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex);
}
内置实现类
| 实现类 | 功能 |
|---|---|
| ExceptionHandlerExceptionResolver | 处理 @ExceptionHandler 方法 |
| DefaultHandlerExceptionResolver | 处理 Spring 标准异常 |
| ResponseStatusExceptionResolver | 处理 @ResponseStatus 注解异常 |
自定义异常解析器
Java
@Component
public class CustomExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) {
ModelAndView mav = new ModelAndView();
if (ex instanceof BusinessException) {
mav.setViewName("error/business");
mav.addObject("code", ((BusinessException) ex).getCode());
mav.addObject("message", ex.getMessage());
} else {
mav.setViewName("error/500");
mav.addObject("message", "系统异常");
}
return mav;
}
}
注册与优先级
Java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
resolvers.add(0, new CustomExceptionResolver());
}
}
自定义解析器默认会覆盖内置解析器,使用 extendHandlerExceptionResolvers 可追加。
与 @ExceptionHandler 配合
Java
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
public Result<String> handleBusinessException(BusinessException ex) {
return Result.fail(ex.getCode(), ex.getMessage());
}
}
要点总结
- resolveException 返回 ModelAndView,返回 null 表示无法处理
- 多个解析器按顺序执行,直到有返回结果
- @ExceptionHandler 注解方式更推荐使用
- 可返回 JSON 错误响应替代错误页面
📝 发现内容有误?点击此处直接编辑