使用Spring MVC的统一异常处理器

    xiaoxiao2022-07-13  158

    转自: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层中的这个方法,配置本地服务器,运行应用程序,得到如下页面:

    出现错误后的跳转页面

    对应的日志文件记录的错误日志:

    程序运行出现错误的日志

    最新回复(0)