對dao、service及action所拋出的異常進行統一處理,在action中就不需要添加try{}catch{}捕獲的代碼。
1.1.1 自定義異常處理器編寫
自定義全局異常處理器,實現HandlerExceptionResolver接口
public class ExceptionResolverCustom implements HandlerExceptionResolver {
// json轉換器
// 將異常信息轉json
private HttpMessageConverter<ExceptionResultInfo>jsonMessageConverter;
// 前端控制器調用此方法執行異常處理
// handler,執行的action類就包裝了一個方法(對應url的方法)
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Objecthandler, Exception ex) {
// 輸出異常信息
ex.printStackTrace();
// 轉成springmvc底層對象(就是對action方法的封裝對象,只有一個方法)
HandlerMethod handlerMethod =(HandlerMethod) handler;
// 取出方法
Method method = handlerMethod.getMethod();
// 判斷方法是否返回json
// 只要方法上有responsebody註解表示返回json
// 查詢method是否有responsebody註解
ResponseBody responseBody = AnnotationUtils.findAnnotation(method,
ResponseBody.class);
if (responseBody !=null) {
// 將異常信息轉json輸出
return this.resolveJsonException(request, response, handlerMethod,
ex);
}
// 這裏說明action返回的是jsp頁面
// 解析異常
ExceptionResultInfo exceptionResultInfo =resolveExceptionCustom(ex);
// 將異常信息在異常頁面顯示
request.setAttribute("exceptionResultInfo",
exceptionResultInfo.getResultInfo());
// 轉向錯誤頁面
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("exceptionResultInfo",
exceptionResultInfo.getResultInfo());
modelAndView.setViewName("/base/error");//邏輯視圖名
return modelAndView;
}
// 異常信息解析方法
private ExceptionResultInfo resolveExceptionCustom(Exception ex) {
ResultInfo resultInfo = null;
if (ex instanceof ExceptionResultInfo) {
// 拋出的是系統自定義異常
resultInfo = ((ExceptionResultInfo)ex).getResultInfo();
} else {
// 重新構造“未知錯誤”異常
resultInfo = new ResultInfo();
resultInfo.setType(ResultInfo.TYPE_RESULT_FAIL);
resultInfo.setMessage("未知錯誤!");
}
return new ExceptionResultInfo(resultInfo);
}
// 將異常信息轉json輸出
private ModelAndView resolveJsonException(HttpServletRequest request,
HttpServletResponse response, Objecthandler, Exception ex) {
// 解析異常
ExceptionResultInfo exceptionResultInfo =resolveExceptionCustom(ex);
HttpOutputMessage outputMessage = new ServletServerHttpResponse(response);
try {
//將exceptionResultInfo對象轉成json輸出
jsonMessageConverter.write(exceptionResultInfo,MediaType.APPLICATION_JSON, outputMessage);
} catch (HttpMessageNotWritableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return new ModelAndView();
}
public HttpMessageConverter<ExceptionResultInfo> getJsonMessageConverter(){
return jsonMessageConverter;
}
public void setJsonMessageConverter(
HttpMessageConverter<ExceptionResultInfo>jsonMessageConverter) {
this.jsonMessageConverter = jsonMessageConverter;
}
}