1. 程式人生 > >SpringMVC統一異常處理(返回異常資料而不是跳轉到某個頁面的方法)

SpringMVC統一異常處理(返回異常資料而不是跳轉到某個頁面的方法)

關於SpringMVC統一異常處理的問題,網搜一大把。網上搜的關於如何進行統一異常處理不外乎如下三種方式:

Spring MVC處理異常有3種方式:
(1) 使用Spring MVC提供的簡單異常處理器SimpleMappingExceptionResolver;
(2) 實現Spring的異常處理介面HandlerExceptionResolver 自定義自己的異常處理器;
(3) 使用@ExceptionHandler註解實現異常處理;

然而,大家都在介紹異常發生的時候如何跳轉到一個特定的頁面。如何在跳轉到的頁面呈現異常資訊等等。

然而,上述處理方式對於我的需求並沒有什麼卵用。我想要的結果是在發生異常之後,不是調轉到某個頁面,而是將異常資訊以資料的形式(比如json資料)返回。

不過本人不才,目前僅僅發現使用ExceptionHandler註解實現統一異常處理的方式,也是可以返回異常資訊而不是跳轉到某個頁面呈現異常資訊的。大家有新的發現不妨告訴我咯。統一異常處理的好處我就不說了,能夠將異常資訊統一捕捉並組裝成固定格式的資料返回的好處,我想在ajax回撥處理中好處可多了, 回撥得到的資料因為格式統一,前端可以很方便的通過某種控制元件進行呈現或友好提示 。 雖然我們也可以手動在Controller層的方法返回的結果中新增異常資訊,但是隻會徒增程式碼量,卻不能使我們更好的專注於業務邏輯。

解決辦法如下:
1、增加BaseExceptionHandleAction類,並在類中同時使用@ExceptionHandler和@ResponseBody註解宣告異常處理,程式碼如下:


import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.annotation.ExceptionHandler;
import
org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import com.core.exception.BusinessException; import com.core.util.JsonUtil; public class BaseExceptionHandleAction { protected HttpServletRequest getServletRequest() { return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); } protected ServletContext getServletContext() { HttpServletRequest request = getServletRequest(); if (request != null) { return request.getSession().getServletContext(); } return null; } protected HttpServletResponse getServletResponse() { return RequestResponseContext.getResponse(); } protected void writeResponse(ActionResult result) throws IOException { HttpServletResponse response = getServletResponse(); response.setContentType("text/html; charset=utf-8"); OutputStream stream = response.getOutputStream(); stream.write(JsonUtil.toJson(result).getBytes("utf-8")); stream.flush(); stream.close(); } /** 基於@ExceptionHandler異常處理 */ /*@ExceptionHandler public ModelAndView handleAndReturnPage(HttpServletRequest request, HttpServletResponse response, Exception ex) { ModelAndView mv = new ModelAndView("Exception") ; mv.addObject("ex", ex); // 根據不同錯誤轉向不同頁面 if (ex instanceof BusinessException) { return mv; } else { return mv; //返回Exception.jsp頁面 } }*/ /** 基於@ExceptionHandler異常處理 */ @ExceptionHandler @ResponseBody public Map<String, Object> handleAndReturnData(HttpServletRequest request, HttpServletResponse response, Exception ex) { Map<String, Object> data = new HashMap<String, Object>(); if(ex instanceof BusinessException) { BusinessException e = (BusinessException)ex; data.put("code", e.getCode()); } data.put("msg", ex.getMessage()); data.put("excetion", ex.getClass().getSimpleName()); return data; } }

2、修改程式碼,使所有需要異常處理的Controller都繼承該類,如下所示,修改後的ExceptionTestController類繼承於BaseExceptionHandleAction:


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.core.exception.BusinessException;
import com.core.springmvc.BaseExceptionHandleAction;

@Controller
public class ExceptionTestController extends BaseExceptionHandleAction {

    // http://localhost:8080/SSM/exceptionTest?id=10
    @RequestMapping(value = "/exceptionTest", method = RequestMethod.GET)
    public void controller(HttpServletRequest request, HttpServletResponse response, Integer id) {
        if (id == 10) {
            throw new BusinessException(10, "該異常代表使用者資訊不完整");

        } else if (id == 20) {
            throw new BusinessException(20, "該異常代表使用者資訊洩露");

        } else {
            throw new BusinessException(30, "該異常代表使用者不存在");
        }
    }

}

3、本人的BusinessException類的程式碼如下


public class BusinessException extends RuntimeException {

    /**
     */
    private static final long serialVersionUID = -7638041501183925225L;

    private Integer code;

    public BusinessException(Integer code, String msg) {
        super(msg);
        this.code = code;
    }

    public BusinessException(Integer code, String msg, Throwable cause) {
        super(msg, cause);
        code = code;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }




}

{
“msg “:” 該異常代表使用者資訊洩露”,
“code” : 20,
“excetion” : “BusinessException”
}

5、至此,需求完美解決。只需要@ExceptionHandler和@ResponseBody兩個註解同時使用即可完美解決需求。注意:我的BaseExceptionHandleAction類中還有一個註釋了的方法,該方法僅僅使用了註解@ExceptionHandler,所以該註釋了的方法可以在發生異常時候跳轉到某個指定頁面。但是注意,這兩個方法不能同時存在,否則spring MVC不知道異常發生時該使用哪個方法來處理異常。

相關推薦

SpringMVC統一異常處理返回異常資料某個頁面方法

關於SpringMVC統一異常處理的問題,網搜一大把。網上搜的關於如何進行統一異常處理不外乎如下三種方式: Spring MVC處理異常有3種方式: (1) 使用Spring MVC提供的簡單異常處理器SimpleMappingExceptionResol

java關於異常處理只使用try-finally使用catch

1. 前言: 通常我們在異常處理的時候一般就使用try-catch, try { // 需要處理的程式碼段 } catch(Exception e) { // 異常處理方法 } 更加好一些的處理方式為try-catch-finally,

前臺ajax重寫方法搭配後臺filter返回status實現ajax請求登入頁面

前後端分離之後,原生的jquery的ajax不能實現控制頁面跳轉,一般會出現狀態碼302錯誤,但是可以通過重寫ajax增強方法,搭配後臺返回狀態碼錯誤實現頁面跳轉.後臺的filter核心程式碼為 HttpServletResponse httpResponse = (Ht

html 中a標籤的問題無反應,,呼叫方法

讓超連結點選後不跳轉,可以用href = "#",但是這個#就會錨點到頁面最上邊     點選連結後不跳轉可以設定成     1.<a href="javascript:void(0);" >javascript:void(0);</a>     2.

ajax實現提交資料並且

<form id="myform" action="submit.php" method="post"> <textarea name="saytxt" rows="2" cols="40"></textarea> <input t

解決SpringMVC返回Json資料格式嚴謹報異常的問題草稿未完成

週末除錯程式的時候發現的該問題,表現如下:      當springmvc配合jackson返回json資料不是嚴格按照json格式返回時,如服務端返回:{“age":20}      同域請求不報錯,瀏覽器直接請求也不報錯可以正常返回,但跨域用jquery請求時會報一個unexpected end of

springMVC --全局異常處理兩種方式

nal font method mil -h util 一個 fail space 首先看springMVC的配置文件: <!-- 全局異常配置 start --> <bean id="exceptionResolv

spring boot 1.5.4 統一異常處理

springboot springboot1.5.4 springboot整合springdatajpa springboot集成jdbctemplate springboot異常處理 上一篇:springboot 1.5.4 配置文件詳解(八) 1 Spring Boot統一異

SpringMVC攔截器與異常處理

在我們SpringMVC中也可以使用攔截器對使用者的請求進行攔截,使用者可以自定義攔截器來實現特定的功能。自定義攔截器必須要實現HandlerInterceptor介面 package com.spring.mvc.interceptor; import javax.servlet.htt

SpringBoot進階之統一異常處理含原始碼

淺談異常處理 在J2EE專案的開發中,不管是對底層的資料庫操作過程,還是業務層的處理過程,還是控制層的處理過程,都不可避免會遇到各種可預知的、不可預知的異常需要處理。每個過程都單獨處理異常,系統的程式碼耦合度高,工作量大且不好統一,維護的工作量也很大。

Spring Cloud實戰小貼士:Zuul統一異常處理

在前幾天釋出的《Spring Cloud實戰小貼士:Zuul統一異常處理(一)》一文中,我們詳細說明了當Zuul的過濾器中丟擲異常時會發生客戶端沒有返回任何內容的問題以及針對這個問題的兩種解決方案:一種是通過在各個階段的過濾器中增加try-catch塊,實現過濾器內部的異常處理;另一種是

學習springBoot 進階統一異常處理

在實際開發當中我們經常會遇到BUG,所以都會封裝一個異常返回類來使用,提示我們到底是那一步出了問題,方便於我們追蹤問題並且解決問題, 以下舉個新增女孩物件為例子,當新增的女孩物件年齡小於10歲時我們提示該女孩在上小學,大於10歲且小於16歲提示可能在上初中,通過例子說明我們如何對異常統一處理並返

TCP異常處理accept返回前連線中止與SO_LINGER選項

一、accept返回前終止分析 問題一: 因為accept是堵塞的, 並且等待來自客戶端的連線, 但是, 如果在accept期間 , 如果因為系統呼叫中斷了accept就會返回一個非致命的錯誤, 而此時有來自客戶端進行TCP三路握手完成後, 而我們通過迴圈在此呼叫accept函式可以完成連線

SpringBoot 統一異常處理十六

每個異常都自己去處理很麻煩,所以我們建立一個全域性異常處理類來統一處理異常 一,首先建立全域性異常處理類:通過使用@ControllerAdvice定義統一的異常處理類,而不是在每個Controller中逐個定義。@ExceptionHandler用來定義函式針對的異常型別

JAVA學習第十九課java程序的異常處理

num 函數 錯誤 style col 編譯失敗 return [] java 異常處理的捕捉形式: 這是能夠對異常進行針對性處理的方式 六、try、catch的理解 詳細格式: try { //須要被檢測異常的代碼 } catch(異常類 變量)//改變量用

Servlet 異常處理 配置錯誤頁面

使用 程序 頁面 sco class exception clas type load 當一個 Servlet 拋出一個異常時,Web 容器在使用了 exception-type 元素的 web.xml 中搜索與拋出異常類型相匹配的配置。 您必須在 web.xml 中使用

實習培訓——Java異常處理8

如何工作 出了 我們 個數 試圖 類對象 bject epo 很多 實習培訓——Java異常處理(8) Java 異常處理 異常是程序中的一些錯誤,但並不是所有的錯誤都是異常,並且錯誤有時候是可以避免的。 比如說,你的代碼少了一個分號,那麽運行出來結果是提示是錯誤 java

java中的try-catch-finnal異常處理學習筆記

不堪 java sha highlight 抽取 最終 throwable 關鍵字 學習筆記 一、異常概述 異常:Exception,是在運行發生的不正常情況。 原始異常處理: if(條件) {   處理辦法1  處理辦法2  處理辦法3} if(條件) {   處理辦法

MVC異常處理異常捕獲

src err 捕獲 uestc 技術 filters customer request sta 1.cshtml頁面異常 2.Controller異常 3.路由參數異常。 4.頁面不存在404 頁面不存在404,可以通過配置config來處理

錯誤和異常處理7

為什麽 nbsp 實現 str ron strong 指令 異常處理 處理 配置指令 錯誤日誌 異常處理 為什麽異常處理很方便 PHP的異常處理實現 SPL異常 錯誤和異常處理(7)