1. 程式人生 > >springMVC --全局異常處理(兩種方式)

springMVC --全局異常處理(兩種方式)

nal font method mil -h util 一個 fail space

首先看springMVC的配置文件:

<!-- 全局異常配置 start -->     
     <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">     
         <property name="exceptionMappings">     
             <props>     
                 <prop key="java.lang.Exception">errors/error</prop>     
                 <prop key="java.lang.Throwable">errors/err</prop>     
             </props>     
         </property>     
         <property name="statusCodes">     
             <props>     
                 <prop key="errors/error">500</prop>     
                 <prop key="errors/404">404</prop>     
             </props>     
         </property>     
         <!-- 設置日誌輸出級別,不定義則默認不輸出警告等錯誤日誌信息 -->     
         <property name="warnLogCategory" value="WARN"></property>     
         <!-- 默認錯誤頁面,當找不到上面mappings中指定的異常相應視圖時,使用本默認配置 -->     
         <property name="defaultErrorView" value="errors/error"></property>     
         <!-- 默認HTTP狀態碼 -->     
         <property name="defaultStatusCode" value="500"></property>     
     </bean>     
     <!-- 全局異常配置 end -->

這裏基本的類是SimpleMappingExceptionResolver類。和他的父類AbstractHandlerExceptionResolver類。

能夠看到源代碼中和上述配置相應的屬性;


技術分享

另外要註意的是日誌

<span style="font-size:14px;"><property name="warnLogCategory" value="WARN"></property></span>

級別設置為WARN:

技術分享


也能夠實現HandlerExceptionResolver接口或者繼承SimpleMappingExceptionResolver

,寫一個自己的異常處理程序

public class SpringMVCSimpleMappingExceptionResolver extends SimpleMappingExceptionResolver {
	
	public static final Log log = LogFactory.getLog(SpringMVCSimpleMappingExceptionResolver.class);
	
	@Override
	protected ModelAndView doResolveException(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex) {
		ModelAndView mv = null;
		String accept = request.getHeader("accept");
        if (accept != null && !(accept.indexOf("application/json") > -1 
        		|| (request.getHeader("X-Requested-With") != null 
        		&& request.getHeader("X-Requested-With").indexOf("XMLHttpRequest") > -1))) {
            mv = super.doResolveException(request, response, handler, ex);
        } else {
            try { 
            	// json 請求返回
                PrintWriter writer = response.getWriter();  
                writer.write(Return.failure((ex.getMessage())));
                writer.flush();
            } catch (IOException e) {
            	if (log.isInfoEnabled()) {
            		log.info(StringUtil.getTrace(e));
            	}
            }
        }
        doLog((HandlerMethod) handler, ex);
        return mv;
	}
	
	/**
	 * 記錄異常日誌
	 * 
	 * @param handler
	 * @param excetpion
	 */
	private void doLog(HandlerMethod handler, Exception excetpion) {
        if (log.isEnabledExceptionDb()) {
        	// 異常信息日誌入庫
        }
	}	
}

springMVC --全局異常處理(兩種方式)