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

所属分类: 软件编程 / java 阅读数: 25
收藏 0 赞 0 分享

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

更多精彩内容其他人还在看

Java的面向对象编程基本概念学习笔记整理

这篇文章主要介绍了Java的面向对象编程基本概念学习笔记整理,包括类与方法以及多态等支持面向对象语言中的重要特点,需要的朋友可以参考下
收藏 0 赞 0 分享

Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法

这篇文章主要介绍了Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

基于Java实现杨辉三角 LeetCode Pascal's Triangle

这篇文章主要介绍了基于Java实现杨辉三角 LeetCode Pascal's Triangle的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java中Spring获取bean方法小结

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢?下面通过本文给大家介绍Java中Spring获取bean方法小结,对spring获取bean方法相关知识感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

如何计算Java对象占用了多少空间?

在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小,需要的朋友可以参考下
收藏 0 赞 0 分享

剖析Java中的事件处理与异常处理机制

这篇文章主要介绍了Java中的事件处理与异常处理机制,讲解Java是如何对事件或者异常作出响应以及定义异常的一些方法,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Java的Struts2框架的结构及其数据转移方式

这篇文章主要介绍了详解Java的Struts2框架的结构及其数据转移方式,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

Java封装好的mail包发送电子邮件的类

本文给大家分享了2个java封装好的mail包发送电子邮件的类,并附上使用方法,小伙伴们可以根据自己的需求自由选择。
收藏 0 赞 0 分享

在Java的Struts中判断是否调用AJAX及用拦截器对其优化

这篇文章主要介绍了在Java的Struts中判断是否调用AJAX及用拦截器对其优化的方法,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

java多线程Future和Callable类示例分享

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们就来研究下Future和Callab
收藏 0 赞 0 分享
查看更多