一、 @ExceptionHandler异常处理
1.1异常处理步骤
- 在 SpringMVC 全局配置文件中加上
<mvc:annotation-driven/>
标签 - 在异常处理类上加上
@ControllerAdvice
注解 - 在异常处理方法上加上
@ExceptionHandler(异常.class)
注解
至于为什么要在全局配置文件中加上<mvc:annotation-driven/>
注解,原因是 SpringMVC 默认没有装配ExceptionHandlerExceptionResolver
,会导致@ExceptionHandler
注解不会生效,加上<mvc:annotation-driven/>
注解后会自动对ExceptionHandlerExceptionResolver
进行配置。
1.2测试
spring-mvc.xml
全局配置文件:
<!-- 用于自动配置 -->
<mvc:annotation-driven/>
<!--
配置 Spring MVC 扫描的包
这里要扫描到你添加注解的类
-->
<context:component-scan base-package="com.jas"/>
<!-- 配置试图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
异常映射路由:
@RequestMapping("/testExceptionHandler")
public void exception1() {
// 模拟一个异常
System.out.println(100/0);
}
异常处理类ExceptionHandlerTest
:
@ControllerAdvice
public class ExceptionHandlerTest {
/*
* @ExceptionHandler 注解可以具体确定异常的类型或具体的某个异常比如:
* @ExceptionHandler(RuntimeException.class)
* @ExceptionHandler(ArithmeticException.class)
*
* 这里 @ExceptionHandler(Exception.class) 表示处理所有异常
* 返回一个 ModelAndView 进行错误消息提示
*/
@ExceptionHandler(Exception.class)
public ModelAndView handleGlobalException(Exception e) {
ModelAndView modelAndView = new ModelAndView("error");
modelAndView.addObject("exceptionMsg", e);
return modelAndView;
}
}
错误提示页面error.jsp
:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>出错啦,错误信息是:${requestScope.get("exceptionMsg")}</h2>
</body>
</html>
访问控制器中的路由进行测试:
二、SimpleMappingExceptionResolver异常处理
2.1异常处理步骤
1.在 SpringMVC 的全局配置文件中配置SimpleMappingExceptionResolver
SimpleMappingExceptionResolver
是 SpringMVC 提供的一个简单映射处理器,通过上面的步骤可以看出来,使用SimpleMappingExceptionResolver
只需要简单的一步。
在出现异常时,SimpleMappingExceptionResolver
会作一个异常信息处理(在 ModelAndView
中添加错误信息)如下:
2.2测试
共用上面的error.jsp
异常错误提示页面。
在spring-mvc.xml
全局配置文件中添加相应的信息:
<!-- 配置 SimpleMappingExceptionResolver -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 当出现异常时,修改 exceptionAttribute 默认值 exception 为 exceptionMsg -->
<property name="exceptionAttribute" value="exceptionMsg"/>
<property name="exceptionMappings">
<props>
<!--
添加异常映射,可以是自定义异常处理,为了简单的演示,这里处理所有的运行时异常
error 表示出现异常时要跳转的页面,会根据试图解析器中配置的前缀和后缀找到该页面
-->
<prop key="java.lang.RuntimeException">error</prop>
</props>
</property>
</bean>
异常映射路由:
@RequestMapping("/testSimpleMappingExceptionResolver")
public void exception2() {
// 模拟一个数组下标越界异常
int[] a = new int[2];
System.out.println(a[10]);
}
访问控制器中的路由进行测试:
GitHub 代码地址:https://github.com/coderjas/spring-note,springmvc-exception
目录下是这个 demo 对应的代码。