第二十三章 springboot + 全局異常處理

来源:http://www.cnblogs.com/java-zhao/archive/2016/08/13/5769018.html
-Advertisement-
Play Games

一、單個controller範圍的異常處理 說明: 在controller中加入被@ExceptionHandler修飾的類即可(在該註解中指定該方法需要處理的那些異常類) 該異常處理方法只在當前的controller中起作用 二、全部controller範圍內起作用的異常處理(全局異常處理) 1、 ...


一、單個controller範圍的異常處理

 1 package com.xxx.secondboot.web;
 2 
 3 import org.springframework.web.bind.annotation.ExceptionHandler;
 4 import org.springframework.web.bind.annotation.RequestMapping;
 5 import org.springframework.web.bind.annotation.RequestMethod;
 6 import org.springframework.web.bind.annotation.RestController;
 7 
 8 import com.xxx.secondboot.exception.MyExceptionResponse;
 9 
10 import io.swagger.annotations.Api;
11 
12 @Api("測試controllerAdvice和全局異常處理")
13 @RestController
14 @RequestMapping("/advice1")
15 public class AdviceController {
16 
17     @RequestMapping(value = "/test1", method = RequestMethod.GET)
18     public String test1() {
19         throw new RuntimeException("advice1 - exception1");
20     }
21 
22     @RequestMapping(value = "/test2", method = RequestMethod.GET)
23     public String test2() {
24         throw new RuntimeException("advice1 - exception2");
25     }
26 
27     @ExceptionHandler(RuntimeException.class)
28     public MyExceptionResponse exceptionHandler() {
29         MyExceptionResponse resp = new MyExceptionResponse();
30         resp.setCode(300);
31         resp.setMsg("exception-Handler");
32         return resp;
33     }
34 
35 }

說明:

  • 在controller中加入被@ExceptionHandler修飾的類即可(在該註解中指定該方法需要處理的那些異常類)
  • 該異常處理方法只在當前的controller中起作用

二、全部controller範圍內起作用的異常處理(全局異常處理)

1、全局異常處理類

 1 package com.xxx.secondboot.web;
 2 
 3 import javax.servlet.http.HttpServletResponse;
 4 
 5 import org.springframework.web.bind.annotation.ControllerAdvice;
 6 import org.springframework.web.bind.annotation.ExceptionHandler;
 7 import org.springframework.web.bind.annotation.ResponseBody;
 8 import org.springframework.web.bind.annotation.RestController;
 9 
10 import com.xxx.secondboot.exception.MyExceptionResponse;
11 import com.xxx.secondboot.exception.MyRuntimeException;
12 
13 //@ControllerAdvice(annotations=RestController.class)
14 //@ControllerAdvice(basePackages={"com.xxx","com.ooo"})
15 @ControllerAdvice
16 public class GlobalExceptionHandler {
17     @ExceptionHandler(RuntimeException.class)
18     //    @ExceptionHandler(value={RuntimeException.class,MyRuntimeException.class})
19     //    @ExceptionHandler//處理所有異常
20     @ResponseBody //在返回自定義相應類的情況下必須有,這是@ControllerAdvice註解的規定
21     public MyExceptionResponse exceptionHandler(RuntimeException e, HttpServletResponse response) {
22         MyExceptionResponse resp = new MyExceptionResponse();
23         resp.setCode(300);
24         resp.setMsg("exception-Handler");
25         //        response.setStatus(600);
26         return resp;
27     }
28 }

說明:

  • @ControllerAdvice是controller的一個輔助類,最常用的就是作為全局異常處理的切麵類
  • @ControllerAdvice可以指定掃描範圍
  • @ControllerAdvice約定了幾種可行的返回值,如果是直接返回model類的話,需要使用@ResponseBody進行json轉換
    • 返回String,表示跳到某個view
    • 返回modelAndView
    • 返回model + @ResponseBody

2、controller

 1 package com.xxx.secondboot.web;
 2 
 3 import org.springframework.web.bind.annotation.RequestMapping;
 4 import org.springframework.web.bind.annotation.RequestMethod;
 5 import org.springframework.web.bind.annotation.RestController;
 6 
 7 import io.swagger.annotations.Api;
 8 
 9 @Api("測試controllerAdvice和全局異常處理")
10 @RestController
11 @RequestMapping("/advice1")
12 public class AdviceController {
13 
14     @RequestMapping(value = "/test1", method = RequestMethod.GET)
15     public String test1() {
16         throw new RuntimeException("advice1 - exception1");
17     }
18 
19     @RequestMapping(value = "/test2", method = RequestMethod.GET)
20     public String test2() {
21         throw new RuntimeException("advice1 - exception2");
22     }
23 
24     //    @ExceptionHandler(RuntimeException.class)
25     //    public MyExceptionResponse exceptionHandler() {
26     //        MyExceptionResponse resp = new MyExceptionResponse();
27     //        resp.setCode(300);
28     //        resp.setMsg("exception-Handler");
29     //        return resp;
30     //    }
31 
32 }

註意:

  • 同一個異常被局部範圍異常處理器和全局範圍異常處理器同時覆蓋,會選擇小範圍的局部範圍處理器
  • 同一個異常被小範圍的異常類和大範圍的異常處理器同時覆蓋,會選擇小範圍的異常處理器

參考自:

  • http://jinnianshilongnian.iteye.com/blog/1866350 開濤的@ControllerAdvice(三個作用)
  • http://www.tuicool.com/articles/fA7nuii                springboot約定的異常處理體系
  • https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc springMVC異常處理體系
  • http://www.baeldung.com/2013/01/31/exception-handling-for-rest-with-spring-3-2/ springMVC異常處理體系

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 當UNIX函數發生錯誤時,通常會返回一個負值,而且整形變數errno通常被設置為具有特定信息的值。 errno是全局變數,僅當函數出錯才有被改變。對待errno,應註意兩條規則 1:如果沒有出錯,其值不會被常式清除,也就是說,當且僅當函數出錯時,馬上檢查errno的值才有意義。 2:任何函數都不會將 ...
  • 在Linux系統中/tmp文件夾下的文件是會被清理、刪除的,文件清理的規則是如何設定的呢? 以Redhat為例,這個主要是因為作業裡面會調用tmpwatch命令刪除那些一段時間沒有訪問的文件。 那麼什麼是tmpwatch呢?其實tmpwatch是一個命令或者說是一個包。如下所示 tmpwatch -... ...
  • 1.安裝samba伺服器 2.配置 3.新建用戶名,新建文件夾並且設定ACL許可權 ACL: 1.查看是否具有ACL許可權 2.如果1什麼也沒輸出 那麼就需要添加許可權 在/ 那一欄中 磁碟格式後 配置前添加上acl即可 完成之後需要重啟(請設置好,不要不能開機哦!!!) 或者 3.配置acl 4.查看a ...
  • 一,項目背景 記得大學畢業課題,我就是選擇做個CMS,不過當時雖然做了個,不過感覺不是很好,所以現在又重做了,順便發上來供大家討論的。雖然CMS不是什麼特別的項目,但是還是想從一個普通項目學到更多的東西。 二,核心技術 使用asp.net mvc5 模板引擎使用razor。 還有簡單數據操作工具Wa ...
  • 開發中動態類型無外乎list 或者 vector, 這裡就是在C中實現vecotr結構容器部分. ...
  • java.lang.String.getBytes(String charsetName) 方法編碼將此String使用指定的字元集的位元組序列,並將結果存儲到一個新的位元組數組。 聲明 以下是java.lang.String.getBytes()方法的聲明 參數 charset -- 這是一個支持的字 ...
  • Java中String的數據是如何存儲的,查看源代碼就可以知道,String的數據是存儲在char[] value這樣一個成員變數中的,char類型的大小在java中是2個位元組 我們還知道,現在普遍使用的unicode版本是UCS-2,就是使用2個位元組表示一個字元的unicode版本,這就對上了,j ...
  • 集合介面 集合實現(鏈表、數組列表、散列集、樹集、隊列與雙端隊列、映射表) 集合與數組之間的轉換 演算法(排序、二分查找)。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...