SpringMVC 统一异常管理配置方式

       这段时间出差,项目组要求要用SpringMVC的统一异常处理,之前对异常的处理也比较随意,所以通过这次应用感觉SpringMVC的统一异常处理还是比较好用的。

一、SpringMVC统一异常处理的方式

SpringMVC提供了三种统一异常处理的配置方式:

  • 利用springMVC预置的简单异常处理器SimpleMappingExceptionResolver
  • 模拟SimpleMappingExceptionResolver,通过实现springMVC提供的HandlerExceptionResolver接口实现个性化的异常处理器
  •  通过注解的方式实现异常统一处理(@ExceptionHandler)

二、使用SimpleMappingExceptionResolver

SimpleMappingExceptionResolver是spring已经实现的处理器,所以只需要在spring的类容器中注册这个类即可:

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
     <!-- 定义出现默认的异常时,跳转的页面 -->
     <property name="defaultErrorView" value="common/exp"></property>  
     <!-- 定义在异常接收页面,展现内容的属性值 -->
     <property name="exceptionAttribute" value="message"></property> 
     <!-- 定义需要特殊处理的异常 --> 
     <property name="exceptionMappings">  
          <props>  
               <!-- 指定出现空指针异常时,页面跳转到NULL-Exception页面,可以定义多个prop节点 -->
               <prop key="java.lang.NullPointException">common/NULL-Exception</prop>  
          </props>  
     </property>  
</bean>

 异常接收页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>错误提示</title>
</head>
<body>
	自定义的异常处理界面 ${message }
</body>
</html>

 三、继承HandlerExceptionResolver

 自定义一个resolver类,实现HandlerExceptionResolver接口

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;


public class CtrlExceptionResolver implements HandlerExceptionResolver{

	public static Logger log = Logger.getLogger(CtrlExceptionResolver.class);

	@Override
	public ModelAndView resolveException(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex) {
		CtrlException ctrlException = null;

		log.debug("产生异常的URL为" + request.getServletContext() + request.getRequestURI());
		log.debug(ex);
		log.error(ex);

		if(ex instanceof CtrlException){
			ctrlException = (CtrlException)ex;
		} else {
			ctrlException = new CtrlException(ex.toString());
		}
		String message = ctrlException.getMessage();
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.addObject("message", message);
		modelAndView.setViewName("common/exp");

		return modelAndView;
	}

}
 然后可以通过注解或者XML配置的方式将 CtrlExceptionResolver注册到spring类容器中。
<bean class="test.util.exception.CtrlExceptionResolver"></bean>

 四、通过@ExceptionHandler实现异常统一处理

这种方式只需要在你想处理的controller中添加以下处理方法即可:

@ExceptionHandler  
public String exp(HttpServletRequest request, Exception ex) {  
     request.setAttribute("ex", ex);
     return "common/exp"; 
}  

 假如你想特殊处理某些异常,然后跳转到其他页面,可以在代码中判断ex参数的类类型,然后return到你想要的页面。

如果你想让所有的controller都进行类似的异常处理,你可以创建一个基类,然后所有的controller都继承自这个基类,而这个基类中实现上述方法即可。

虽然是在controller中加入的注解,他可以处理到与这个controller产生关联的service、DAO等。

五、优缺点

1、第一种方式可以满足一些简单的异常处理,而且最重要的是,它只能将异常的message打印输送到页面显示, 不能个性化异常信息。

2、第二种方式除了可以满足第一种方式的处理之外,还可以满足个性化异常信息的定义。

3、第三种方式更加灵活,可以根据需要配置想要处理的controller,但是对于代码的侵入性较强。

除了这种方式者外,一些Unchecked Exception需要通过web.xml的配置方式进行处理,如一些404、500的错误:

	<error-page>
		<error-code>404</error-code>
		<location>/error/404.jsp</location>
	</error-page>
	<error-page>
		<error-code>500</error-code>
		<location>/error/500.jsp</location>
	</error-page>

 

猜你喜欢

转载自pzhu424.iteye.com/blog/2294664