二.統一異常處理器

對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;

   }

 

}

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