转自:https://www.jianshu.com/p/20dd0d28c758
使用Spring MVC的统一异常处理器
Spring MVC定义了异常的统一处理机制,其工作原理是:
Spring MVC统一异常处理流程.png
不管是应用程序的哪里出现异常,都向上层抛出异常,最后异常被提交到Spring MVC的Dispatcher Servlet中,Dispatcher Servlet在调用系统统一的异常处理器来处理异常。
借助Spring MVC的异常处理机制,我们通过实现HandlerExceptionResolver接口来定义我们自己的异常处理器,然后在异常处理器里使用log4j对所有的异常进行统一的处理,这样我们就不需要向上面一样在每个可能出现异常的地方都是用try..catch来记录异常。
实现自己的异常处理器:MyExceptionHandler.java
package exceptionHandler;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Created by xiangang on 2016/11/25.
*/
public class MyExceptionHandler implements HandlerExceptionResolver {
private static final Logger logger = Logger.getLogger(MyExceptionHandler.class);
/**
* 通过实现借口HandlerExceptionResolver的resolveException方法,
* 来完成日志的记录,而且还可以指定程序发生错误后跳转的web页面
*/
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
logger.error("",ex);
return new ModelAndView("error").addObject("exception",ex);
}
}
在Spring MVC的配置文件里通过bean声明注册到IoC容器,
省略了其他的配置信息
<!--配置自定义异常处理类-->
<bean id="handlerExceptionResolver" class="exceptionHandler.MyExceptionHandler"/>
修改我们Service层中的方法:ValidateName.java
package service;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
/**
* Created by xiangang on 2016/11/25.
*/
@Service
public class ValidateName {
private static final Logger logger = Logger.getLogger(ValidateName.class);
public boolean validation(String name) {
boolean flag = false;
//故意设置为空,以便抛出异常
String storedName = null;
if (storedName.equals(name)){
flag = true;
return flag;
}else {
return flag;
}
}
}
配置发生错误时的页面:error.jsp
<%--
Created by IntelliJ IDEA.
User: xiangang
Date: 2016/11/25
Time: 下午1:40
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>错误页面!</title>
</head>
<body>
<h1>不好意思,你请求的页面被怪兽吃掉了!</h1>
</body>
</html>
在相关的Controller里面调用Service层中的这个方法,配置本地服务器,运行应用程序,得到如下页面:
出现错误后的跳转页面
对应的日志文件记录的错误日志:
程序运行出现错误的日志