摘要:前言如題,今天介紹是如何統一處理全局異常的。主要是用于異常攔截出獲取并將設置到消息類中返回。狀態碼異常攔截類通過加入來聲明該類可攔截請求,同時在方法加入并在該注解中指定要攔截的異常類。測試訪問測試正常返回數據結果。
微信公眾號:一個優秀的廢人前言
如有問題或建議,請后臺留言,我會盡力解決你的問題。
如題,今天介紹 SpringBoot 是如何統一處理全局異常的。SpringBoot 中的全局異常處理主要起作用的兩個注解是 @ControllerAdvice 和 @ExceptionHandler ,其中 @ControllerAdvice 是組件注解,添加了這個注解的類能夠攔截 Controller 的請求,而 ExceptionHandler 注解可以設置全局處理控制里的異常類型來攔截要處理的異常。 比如:@ExceptionHandler(value = NullPointException.class) 。
準備工作SpringBoot 2.1.3
IDEA
JDK 8
依賴配置配置文件org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-web mysql mysql-connector-java runtime org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test
spring: # 數據庫相關 datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=true username: root password: 123456 jpa: hibernate: ddl-auto: update #ddl-auto:設為 create 表示每次都重新建表 show-sql: true返回的消息類
public class Message工具類implements Serializable { /** * 狀態碼 */ private Integer code; /** * 返回信息 */ private String message; /** * 返回的數據類 */ private T data; /** * 時間 */ private Long time; // getter、setter 以及 構造方法略。。。 }
用于處理返回的數據以及信息類,代碼注釋很詳細不說了。
public class MessageUtil { /** * 成功并返回數據實體類 * @param o * @param自定義異常* @return */ public static Message ok(E o){ return new Message<>(200, "success", o, new Date().getTime()); } /** * 成功,但無數據實體類返回 * @return */ public static Message ok(){ return new Message<>(200, "success", null, new Date().getTime()); } /** * 失敗,有自定義異常返回 * @param code * @param msg * @return */ public static Message error(Integer code,String msg){ return new Message<>(code, msg, null, new Date().getTime()); } }
通過繼承 RuntimeException ,聲明 code 用于定義不同類型的自定義異常。主要是用于異常攔截出獲取 code 并將 code 設置到消息類中返回。
public class CustomException extends RuntimeException{ /** * 狀態碼 */ private Integer code; public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public CustomException(Integer code, String message){ super(message); this.code = code; } }異常攔截類
通過加入 @RestControllerAdvice 來聲明該類可攔截 Controller 請求,同時在 handle方法加入 @ExceptionHandler 并在該注解中指定要攔截的異常類。
@RestControllerAdvice // 控制器增強處理(返回 JSON 格式數據),添加了這個注解的類能被 classpath 掃描自動發現 public class ExceptionHandle { @ExceptionHandler(value = Exception.class) // 捕獲 Controller 中拋出的指定類型的異常,也可以指定其他異常 publicMessage handler(Exception exception){ if (exception instanceof CustomException){ CustomException customException = (CustomException) exception; return MessageUtil.error(customException.getCode(), customException.getMessage()); } else { return MessageUtil.error(120, "異常信息:" + exception.getMessage()); } } }
這里只對自定義異常以及未知異常進行處理,如果你在某方法中明確知道可能會拋出某個異常,可以加多一個特定的處理。比如說你明確知道該方法可能拋出 NullPointException 可以追加 NullPointException 的處理:
if (exception instanceof CustomException){ CustomException customException = (CustomException) exception; return MessageUtil.error(customException.getCode(), customException.getMessage()); } else if (exception instanceof NullPointException ){ return MessageUtil.error(500, "空指針異常信!"); } else { return MessageUtil.error(120, "異常信息:" + exception.getMessage()); }controller 層
@RestController @RequestMapping("/student") public class StudentController { @Autowired private StudentService studentService; @GetMapping("/{id}") public Message完整代碼findStudentById(@PathVariable("id") Integer id){ if (id < 0){ //測試自定義錯誤 throw new CustomException(110, "參數不能是負數!"); } else if (id == 0){ //硬編碼,為了測試 Integer i = 1/id; return null; } else { Student student = studentService.findStudentById(id); return MessageUtil.ok(student); } } }
https://github.com/turoDog/De...
如果覺得對你有幫助,請給個 Star 再走唄,非常感謝。
Postman 測試訪問 http://localhost:8080/student/5 測試正常返回數據結果。
訪問 http://localhost:8080/student/0 測試未知異常的結果。
訪問 http://localhost:8080/student/-11 測試自定義異常的結果。
后語如果本文對你哪怕有一丁點幫助,請幫忙點好看。你的好看是我堅持寫作的動力。
另外,關注之后在發送 1024 可領取免費學習資料。資料內容詳情請看這篇舊文:Python、C++、Java、Linux、Go、前端、算法資料分享
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73505.html
摘要:挺多人咨詢的,異常處理用切面注解去實現去全局異常處理。全局異常處理類,代碼如下代碼解析如下抽象類是用來處理全局錯誤時進行擴展和實現注解標記的切面排序,值越小擁有越高的優先級,這里設置優先級偏高。 本文內容 為什么要全局異常處理? WebFlux REST 全局異常處理實戰 小結 摘錄:只有不斷培養好習慣,同時不斷打破壞習慣,我們的行為舉止才能夠自始至終都是正確的。 一、為什么要全局...
摘要:前言如題,今天介紹的聲明式事務。提供一個注解在配置類上來開啟聲明式事務的支持。而在配置里還開啟了對聲明式事務的支持,代碼如下所以在中,無須顯式開啟使用注解。源碼下載后語以上為聲明式事務的教程。 微信公眾號:一個優秀的廢人如有問題或建議,請后臺留言,我會盡力解決你的問題。 前言 如題,今天介紹 SpringBoot 的 聲明式事務。 Spring 的事務機制 所有的數據訪問技術都有事務處...
摘要:前言估計很多朋友都認為參數校驗是客戶端的職責,不關服務端的事。輕則導致服務器宕機,重則泄露數據。所以,這時就需要設置第二道關卡,服務端驗證了。老項目的服務端校驗不能為空不能為空看以上代碼,就一個的校驗就如此麻煩。 前言 估計很多朋友都認為參數校驗是客戶端的職責,不關服務端的事。其實這是錯誤的,學過 Web 安全的都知道,客戶端的驗證只是第一道關卡。它的參數驗證并不是安全的,一旦被有心人...
閱讀 663·2023-04-26 02:03
閱讀 1037·2021-11-23 09:51
閱讀 1111·2021-10-14 09:42
閱讀 1738·2021-09-13 10:23
閱讀 927·2021-08-27 13:12
閱讀 839·2019-08-30 11:21
閱讀 1001·2019-08-30 11:14
閱讀 1041·2019-08-30 11:09