Spring MVC統一異常處理(包含普通請求異常和ajax請求異常)


  當controller層出現異常時,對於普通的請求異常我們在web.xml里配置一個統一的跳轉頁面來提示用戶,如下:

<error-page>
     <error-code>500</error-code>
     <location>/500.html</location>
</error-page>

  而對於ajax請求拋出的異常呢,讓ajax請求自己捕獲顯然是不友好的,雖然用戶察覺不出什么,但是通過瀏覽器查看請求返回時,出現服務器返回500錯誤顯然是不友好。所以這里統一處理一下ajax請求,友好的提示用戶錯誤信息。

  在Spring MVC中,所有用於處理在請求映射和請求處理過程中拋出的異常的類,都要實現HandlerExceptionResolver接口。HandlerExceptionResolver接口有一個方法resolveException,當controller層出現異常之后就會進入到resolveException這個方法中。

  下面我們直接實現HandlerExceptionResolver接口,重寫resolveException方法,代碼如下: 

public class ExceptionResolver implements HandlerExceptionResolver {

    private static Logger logger = LogManager.getLogger(ExceptionResolver.class);

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) {
        LogUtil.error("", request.getRequestURL().toString(), exception, PlatformNameEnum.DMS, request.getParameterMap(), "");

        // 判斷是否ajax請求
        if ((request.getHeader("accept").indexOf("application/json") > -1 || (request
                .getHeader("X-Requested-With") != null && request.getHeader(
                "X-Requested-With").indexOf("XMLHttpRequest") > -1))) {
            // 如果是ajax請求,JSON格式返回
            try {
                ResultVo resultVo = new ResultVo(false);
                response.setContentType("application/json;charset=UTF-8");
                PrintWriter writer = response.getWriter();
                // 為安全起見,只有業務異常我們對前端可見,否則統一歸為系統異常
                if (exception instanceof BusinessException) {
                    resultVo.setResultAndCode(false, ((BusinessException) exception).getErrorCode(), ((BusinessException) exception).getErrorMessage());
                } else {
                    resultVo.setResultAndCode(false, DmsErrorCode.DMS_ERR_100000.getCode(), "系統異常,請聯系管理員");
                }
                writer.write(JSON.toJSONString(resultVo));
                writer.flush();
                writer.close();
            } catch (IOException e) {
                LogUtil.error("", request.getRequestURL().toString(), exception, PlatformNameEnum.DMS, request.getParameterMap(), "");
                e.printStackTrace();
            }
        }
        //對於非ajax請求,我們都統一跳轉到500.html頁面
        return null;
    }
} 

  另外,我們需要在springmvc配置文件添加如下配置:

<!-- 框架異常處理Handler -->

<bean id="exceptionResolver" class="com.zcz.exceptionresolver.MyExceptionResolver"></bean>

  到此整個異常處理就結束了。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM