简介:
在Spring MVC中,异常处理机制主要通过 HandlerExceptionResolver
接口 及其实现类来实
现,以下是常见的异常处理器类型及其底层接口的概述:
一、底层接口与实现类
Spring MVC 异常处理的核心接口是 HandlerExceptionResolver
,所有异常处理器均通过该接口的 resolveException
方法实现异常解析。主要实现类包括:
-
ExceptionHandlerExceptionResolver
-
功能:处理
@ExceptionHandler
注解定义的方法(包括@ControllerAdvice
中的方法)。 -
底层机制:反射调用匹配的异常处理方法,生成响应。
-
-
ResponseStatusExceptionResolver
-
功能:处理带有
@ResponseStatus
注解的异常或自定义异常。 -
底层机制:根据注解中的状态码和原因生成 HTTP 响应。
-
@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "资源未找到") public class ResourceNotFoundException extends RuntimeException {}
-
-
DefaultHandlerExceptionResolver(默认方式)
-
功能:处理 Spring MVC 内置异常(如参数绑定错误、请求方法不支持等)。
-
底层机制:将异常转换为对应的 HTTP 状态码(如 400、405、500 等)。
-
-
SimpleMappingExceptionResolver
-
功能:将异常映射到视图名或错误页面,支持配置异常与视图的键值对。
-
二、执行流程
-
当控制器抛出异常时,Spring MVC 会依次调用注册的
HandlerExceptionResolver
实现类。 -
按优先级处理:
@ExceptionHandler
→@ControllerAdvice
→ResponseStatusExceptionResolver
→DefaultHandlerExceptionResolver
→SimpleMappingExceptionResolver
。 -
第一个成功处理异常的解析器将终止后续处理。
自定义异常代码举例:
注解法:
这是一个处理器方法,在发生异常时响应一个自定义的页面并且在request域传入异常信息
@ControllerAdvice
public class Controller2 {@ExceptionHandlerpublic String tip(java.lang.Exception e, Model model){model.addAttribute("yiChang",e.getMessage());return "tip";}
}
在tip页面中
<!DOCTYPE html>
<html lang="en" xmlns:th = "http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>出错了请联系管理员</h1>
<div th:text = "${yiChang}"></div>
</body>
</html>
异常后的页面结果
配置文件方式
在配置文件中
<!--配置属于自己的异常处理器--><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- order值越低优先级越高--><property name="order" value="0"/><property name="exceptionMappings"><props><!-- 发生后跳转视图--><prop key="java.lang.Exception">tip</prop></props></property><!-- 以下配置的含义--><!-- 底层执行 request.setAttribute("yiChang",异常对象)--><property name="exceptionAttribute" value="yiChang"/></bean>
注意:一定要配order属性设置优先级,因为配置文件方法底层走了SimpleMappingExceptionResolver的类这个类的优先级默认是小于DefaultHandlerExceptionResolver的,不设置的话默认依然会走默认异常处理器,不会走你自定义的