SpringMVC異常處理

Spring MVC處理異常有3種方式:

(1)使用Spring MVC提供的簡單異常處理器SimpleMappingExceptionResolver;

(2)實(shí)現(xiàn)Spring的異常處理接口HandlerExceptionResolver 自定義自己的異常處理器;

(3)使用@ExceptionHandler注解實(shí)現(xiàn)異常處理;

1. 集成異常處理

使用SimpleMappingExceptionResolver實(shí)現(xiàn)異常處理

1、在Spring的配置文件springMVC.xml中增加以下內(nèi)容:

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 
  <!-- 定義默認(rèn)的異常處理頁面,當(dāng)該異常類型的注冊(cè)時(shí)使用 -->
  <property name="defaultErrorView" value="error"></property> 
  <!-- 定義異常處理頁面用來獲取異常信息的變量名,默認(rèn)名為exception -->
  <property name="exceptionAttribute" value="ex"></property> 
  <!-- 定義需要特殊處理的異常,用類名或完全路徑名作為key,異常也頁名作為值 -->
  <property name="exceptionMappings"> 
    <props> 
      <prop key="cn.basttg.core.exception.BusinessException">error-business</prop> 
      <prop key="cn.basttg.core.exception.ParameterException">error-parameter</prop> 
  
      <!-- 這里還可以繼續(xù)擴(kuò)展對(duì)不同異常類型的處理 -->
    </props> 
  </property> 
</bean> 

2.實(shí)現(xiàn)HandlerExceptionResolver 接口自定義異常處理器

增加HandlerExceptionResolver 接口的實(shí)現(xiàn)類MyExceptionHandler,代碼如下:

public class MyExceptionHandler implements HandlerExceptionResolver { 
  
  public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, 
      Exception ex) { 
    Map<String, Object> model = new HashMap<String, Object>(); 
    model.put("ex", ex); 
      
    // 根據(jù)不同錯(cuò)誤轉(zhuǎn)向不同頁面 
    if(ex instanceof BusinessException) { 
      return new ModelAndView("error-business", model); 
    }else if(ex instanceof ParameterException) { 
      return new ModelAndView("error-parameter", model); 
    } else { 
      return new ModelAndView("error", model); 
    } 
  } 
} 

2、在Spring的配置文件springMVC.xml中增加以下內(nèi)容:

<bean id="exceptionHandler" class="cn.basttg.core.exception.MyExceptionHandler"/> 

3.使用@ExceptionHandler注解實(shí)現(xiàn)異常處理

增加CrowdExceptionResolver 類,并在類中使用@ExceptionHandler注解聲明異常處理,代碼如下:

public class CrowdExceptionResolver {
    /**
     * 空指針異常
     */
    @ExceptionHandler(value = NullPointerException.class)
    public ModelAndView resolverNullPointerException(NullPointerException exception, HttpServletRequest request, HttpServletResponse response) throws IOException {
        return commonResolver("system-error", exception,request,response);
    }
    /**
     * 數(shù)學(xué)異常
     */
    @ExceptionHandler(value = ArithmeticException.class)
    public ModelAndView resolverNullPointerException(ArithmeticException e, HttpServletRequest request, HttpServletResponse response) throws IOException {
        System.out.println(e.getMessage());
        return commonResolver("system-error", e,request,response);
    }



    /**
     * 通用異常處理
     * @param viewName 跳轉(zhuǎn)視圖名字
     * @param e  異常類型
     * @param request 請(qǐng)求
     * @param response 響應(yīng)
     * @return
     * @throws IOException
     */
   protected ModelAndView  commonResolver(String viewName ,Exception e, HttpServletRequest request, HttpServletResponse response) throws IOException {
       boolean requestJson = CrowdUtil.isRequestAjax(request);
       if (requestJson){//Ajax請(qǐng)求
           ResultEntity<Object> resultEntity = ResultEntity.failed(e.getMessage());
           String json = new Gson().toJson(resultEntity);
           response.getWriter().write(json);
           return null;
       }
       ModelAndView modelAndView = new ModelAndView();
       modelAndView.addObject("exception",e);
       modelAndView.setViewName("system-error");
       return modelAndView;
   }
}

2、修改代碼,使所有需要異常處理的Controller都繼承該類,如下所示,修改后的TestController類繼承于BaseController:

public class TestController extends CrowdExceptionResolver 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容