当前位置: 移动技术网 > IT编程>开发语言>Java > 基于SpringMVC的全局异常处理器介绍

基于SpringMVC的全局异常处理器介绍

2019年07月22日  | 移动技术网IT编程  | 我要评论

jeechan,致富商机网,我知道女人心

近几天又温习了一下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的全局异常处理器介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网