欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-11-30 12:05:46
近几天又温习了一下springmvc的运行机制以及原理 我理解的springmvc,是设计模式mvc中c层,也就是controller(控制)层,常用的注解有@contr...

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