springmvc全局異常處理

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">最近使用shiro做個項目,也包括幾個萬精油框架spring、mybatis</span>

其實用springmvc來實現全局異常處理我在一起的學習demo中也用到了,今天因爲有些地方不是那麼清晰了,所以乾脆寫成博客,記錄下來。

用springmvc實現全局異常處理我知道的有兩種方式:

1、繼承HandlerExceptionResolver實現個自定義的全局異常處理器,重寫resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) 

有4個參數,第一個(請求當前的HTTP請求)、第二個(響應當前的HTTP響應)、第三個(處理程序執行處理程序)、第四個(拋出的異常

就是當你的程序拋出異常時,會回調這個方法。我們可以根據Exception的類型做出不同的處理

if(ex instanceof CustomException){
<span style="white-space:pre">	</span>System.out.println("這是自定義異常");
}ielse if(ex instanceof Exception){
<span style="white-space:pre">	</span>System.out.println("這是系統異常");
}
最後這個方法返回一個ModelAndView 可以把錯誤信息顯示在頁面上

要spring知道我們自定義了這個全局異常處理器只需在 spring配置文件中加入這個bean

<bean class="com.zzger.CustomHandlerExceptionResolver"/>

2、使用@ExceptionHandler註解來處理異常,我也非常喜歡這種方式,最重要的一點是它可以返回任何東西,不只是一個ModelAndView,可以是json等等..

可以在我們自己的controller中的方法上加上這個註解

<span style="white-space:pre">	</span>@ExceptionHandler(CustomException.class)
	@ResponseBody
	@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
	public MessageVo CustomException(CustomException ex){
		MessageVo vo = new MessageVo();
		vo.setStatus(ex.getStatus());
		vo.setMessage(ex.getMessage());
		return vo;
	}
	
這是我的一個示例
@ExceptionHandler裏的參數是你想處理那個異常的class,上面的代碼意思就是這個方法會處理所有拋出CustomException的異常
<pre name="code" class="java">@ResponseBody是把返回值按json輸出
@ResponseStatus是修改此次的http響應碼


然後今天就有一個地方忘記了

我把所以的ExceptionHandler單獨放到了一個Controller中,可是出現異常的時候沒有效果,原來我以前是把其他controller繼承此Controller,所以纔有效果

不過spring3.2之後提供了一個註解@ControllerAdvice,可以把當前的@ExceptionHandler在所以的@RequestMapping方法上都有效哦



嗯,因爲我現在喜歡用ajax來和後臺進行交互,所以第二種方式處理異常真是太棒了,寫安卓的時候同樣如此


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章