1. 在applicationContext.xml中配置exceptionResolver
<bean id="exceptionResolver"
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView">
<value>error</value>
</property>
<property name="exceptionMappings">
<props>
<prop key="java.sql.SQLException">errorDB</prop>
<prop key="java.lang.RuntimeException">errorRT</prop>
</props>
</property>
</bean>
2. errorRT.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.lang.Exception" %>
<%@ page import="java.io.PrintWriter" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!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>Insert title here</title>
</head>
<body>
<%Exception ex=(Exception)request.getAttribute("exception");%>
<H2>Exception:</H2>
<%ex.printStackTrace(new PrintWriter(out));%>
<!--<c:out value="${exception}"></c:out>-->
</body>
</html>
自定义异常解析器:
- public class MyExceptionResolver implements HandlerExceptionResolver {
- @Override
- public ModelAndView resolveException(HttpServletRequest request,
- HttpServletResponse response, Object obj, Exception exception) {
- // TODO Auto-generated method stub
- ModelAndView result=new ModelAndView("showError");
- result.addObject("exception", exception);
- return result;
- }
- }
然后在spring-servlcet.xml中初始化:
- <bean id="exceptionResolver"
- class="com.zah.web.controller.MyExceptionHandler"/>
但是我们不能再在此bean中定义如下属性了:
- <property name="defaultErrorView">
- <value>failure</value>
- </property>
- <property name="exceptionMappings">
- <props>
- <prop key="java.sql.SQLException">showDBError</prop>
- <prop key="java.lang.RuntimeException">showError</prop>
- </props>
- </property>
- <property name="warnLogCategory" value="WARN"></property>
- <property name="defaultStatusCode" value="500"></property>
需要手动处理log:
- public class MyExceptionResolver implements HandlerExceptionResolver {
- @Override
- public ModelAndView resolveException(HttpServletRequest request,
- HttpServletResponse response, Object obj, Exception exception) {
- // TODO Auto-generated method stub
- ModelAndView result=new ModelAndView("showError");
- result.addObject("exception", exception);
- return result;
- }
- private Log warnLogger;
- public void setWarnLogCategory(String loggerName) {
- this.warnLogger = LogFactory.getLog(loggerName);
- }
- protected void logException(Exception ex, HttpServletRequest request) {
- if (this.warnLogger != null && this.warnLogger.isWarnEnabled()) {
- this.warnLogger.warn("Handler execution resulted in exception", ex);
- }
- }
- }
写的有点烂,算是记录吧,其实可以看看SimpleMappingExceptionResolver源码,可以再扩展SimpleMappingExceptionResolver类来满足自己的业务需求。