上篇中提到在spring-servlet.xml中配置了异常统一拦截处理并记录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;
}
}
然后在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类来满足自己的业务需求。