基于SpringMVC的全局异常处理器介绍
近几天又温习了一下springmvc的运行机制以及原理
我理解的springmvc,是设计模式mvc中c层,也就是controller(控制)层,常用的注解有@controller、@requestmapping、@autowared、@component,今天呢,我所要写的是springmvc的全局异常处理器,关联的接口有handlerexceptionresolver(eclipse用户可以按ctrl+shift+t进行搜索该接口),什么是全局异常处理器?为什么要用它呢?
在企业开发中,各种的runtime异常可能会让我们崩溃,但是还有一部分异常在此之外,因此我们就要捕获它,然后进行操作提示(将错误提示返回到modelandview)
下来呢,我贴一部分代码
首先呢,创建一个自定义的异常类
/** * @title: exceptioncustom.java * @description: 本地异常 * @author choviwu * @version v1.0 */ public class exceptioncustom extends exception{ /** * @fields serialversionuid : */ private static final long serialversionuid = 1l; private string message; /** * @return the message */ public string getmessage() { return message; } /** * @param message the message to set */ public void setmessage(string message) { this.message = message; } public exceptioncustom() { super(); // todo auto-generated constructor stub } public exceptioncustom(string message) { super(message); this.message = message; } }
创建一个全局异常处理器的类,让它实现handlerexceptionresolver 接口。相信,基础好一点的同学可以看出来我代码的意思(注释)
import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import org.apache.log4j.logger; org.springframework.web.servlet.handlerexceptionresolver; import org.springframework.web.servlet.modelandview; /** * @title: simpleexception.java * @description:全局异常处理器 * @author choviwu * @version v1.0 */ public class simpleexceptionresolver implements handlerexceptionresolver { // 异常对象 exceptioncustom exceptioncustom = null; private logger logger = logger.getlogger(simpleexceptionresolver.class .getsimplename()); /** * 全局处理异常 */ public modelandview resolveexception(httpservletrequest request, httpservletresponse response, object handler, exception ex) { //转化为自定义异常 exceptioncustom = (exceptioncustom) ex; //判断是否是本地异常 if (ex instanceof exceptioncustom) { logger.info(ex.getmessage()); } else { …抛出错误 } //获取异常信息 string message = exceptioncustom.getmessage(); modelandview mv = new modelandview(); //将异常返回到model mv.addobject("xx", message); // 指向错误页面 mv.setviewname("error"); return null; } }
解释一下,在判断一个异常是否是其他异常的时候,先看它是否属于本地异常(exception)的exceptioncustom ,如果是本地异常,则抛出本地异常信息
if (ex instanceof exceptioncustom) { logger.info(ex.getmessage()); } else { …抛出错误 }
如果不是本地异常,则抛出未知异常
然后从异常里面获取异常信息,将异常信息返回到mv中,最后转至页面,当然严谨一点的,会将异常信息添加到数据库中,方便查看
由于本文章只是一个demo,所以没有考虑到很多因素
下来,说说配置文件
配置文件,先贴上代码,然后再做解释
<!-- 全局异常处理器 --> <bean id="handlerexceptionresolver" class = "xxxx(包名).simpleexceptionresolver"/>
注意:首先,这个bean将配置在自己的web层.xml(spring-web.xml),当启动tomcat,加载web.xml后需加载spring-web.xml
之前注入的bean的id我随便写了一个名称,然后spring解析的时候报错了,
之后看了源码的时候,才知道原来是这么回事
1springmvc 在org.springframework.web.servlet.dispatcherservlet类中声明了 public static final string handler_exception_resolver_bean_name = "handlerexceptionresolver";
private void inithandlerexceptionresolvers(applicationcontext context) { this.handlerexceptionresolvers = null; if (this.detectallhandlerexceptionresolvers) { // find all handlerexceptionresolvers in the applicationcontext, including ancestor contexts. map<string, handlerexceptionresolver> matchingbeans = beanfactoryutils .beansoftypeincludingancestors(context, handlerexceptionresolver.class, true, false); if (!matchingbeans.isempty()) { this.handlerexceptionresolvers = new arraylist<handlerexceptionresolver>(matchingbeans.values()); // we keep handlerexceptionresolvers in sorted order. ordercomparator.sort(this.handlerexceptionresolvers); } } else { try { handlerexceptionresolver her = context.getbean(handler_exception_resolver_bean_name, handlerexceptionresolver.class); this.handlerexceptionresolvers = collections.singletonlist(her); } catch (nosuchbeandefinitionexception ex) { // ignore, no handlerexceptionresolver is fine too. } }
看完这段代码的同学应该就知道为什么把bean 的id 设置成handlerexceptionresolver了吧
handlerexceptionresolver her =context.getbean(handler_exception_resolver_bean_name, handlerexceptionresolver.class);
所以说,全局异常处理器的bean的id不能随便的设置。
以上这篇基于springmvc的全局异常处理器介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
上一篇: PS设计制作一个逼真的翻页日历图标教程