全局异常拦截
场景
权限不够,主动抛异常
事务过程中,出现异常
日志 , 记录异常日志
思路
通过主动或者被动抛出异常,通过技术手段拦截到该异常,对异常进行处理.
比如,执行[删除]功能,发现权限不够,主动抛出异常,拦截到该异常后,进行处理,返回给页面一个提示[权限不够]
技术实现
SpringMVC中[前端控制器]中有处理异常的组件,SimpleMappingExceptionResolver 处理异常.在请求执行过程中,Controller调用Service,Service调用Mapper,无论哪一级报错,都会向上抛出,最终抛到[前端控制器].目前[前端控制器]没有任何处理,直接将异常抛到页面
现在,就需要定义异常处理类,将异常处理
一.自定义异常类
package com.zzx.exception;
/** * @auther ZhengZiXuan * @date 2021/3/17 19:20 * @desc 自定义异常类 */
public class MyException extends RuntimeException{
public MyException(String message){
super(message);
}
}
二.定义SpringMVC中拦截异常的解析类–>自己新建类实现以后解析接口
package com.zzx.interceptor;
import com.zzx.exception.MyException;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/** * @auther ZhengZiXuan * @date 2021/3/17 19:24 * @desc 自定义异常类 */
public class MyExceptionInterceptor implements HandlerExceptionResolver {
/** * @param httpServletRequest 请求对象 * @param httpServletResponse 响应对象 * @param handler Controller对象 * @param ex***** 抛出的异常对象 * @return */
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler, Exception ex) {
System.out.println("--------------------------------------------------------------------");
System.out.println(" | " +ex +" | ");
System.out.println("--------------------------------------------------------------------");
ModelAndView modelAndView = new ModelAndView();
// 如果是自定义[权限][事务][日志]...
if (ex instanceof MyException){ //判断抛出的异常是自定义异常
}
modelAndView.setViewName("forward:/error.jsp"); //异常抛出到的jsp文件
modelAndView.addObject("msg","删除失败,抛出自定义异常"); //异常抛出到的页面的显示的数据
return modelAndView;
}
}
三.error.jsp获得MyExceptionInterceptor 中${msg}中的数据
<%--
Created by IntelliJ IDEA.
User: rooy
Date: 2021/3/17
Time: 19:33
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${ msg}
</body>
</html>
四.将异常拦截类配置到SpringMVC.xml的容器
<!--拦截异常的bean-->
<bean id="myExceptionInterceptor" class="com.zzx.interceptor.MyExceptionInterceptor"></bean>