<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
預設情況,SpringBoot 提供兩種不同響應方式
html
postman
等偵錯工具請求不存在的url或伺服器端異常時,預設返回json資訊一般我們不會將錯誤資訊返回前端,自己去try catch
捕獲異常,但有個問題:每個方法都這樣捕獲異常,肯定是不合適,這是我們就需要全域性的例外處理了。
@RestController public class ExceptionController { @GetMapping("exceptionA") public void methodA() { try { int a = 100 / 0; } catch (Exception e) { e.printStackTrace(); } } }
使用@EceptionHandle
註解實現某個類的區域性例外處理
@RestController public class ExceptionController { @GetMapping("exceptionA") public void methodA() { int a = 100 / 0; } /** * 區域性例外處理 */ @ExceptionHandler(Exception.class) public String exHandler(Exception e) { // 判斷髮生異常的型別是除0異常則做出響應 if (e instanceof ArithmeticException) { return "發生了除0異常"; } // 未知的異常做出響應 return "發生了未知異常"; } }
使用@ControllerAdvice
+@ExceptionHandler
註解實現全域性例外處理
自定義一個異常類
@RestControllerAdvice public class DefaultException { @ExceptionHandler({NullPointerException.class}) public String exception(NullPointerException exception) { return "空指標異常"; } @ExceptionHandler({IndexOutOfBoundsException.class}) public String exception(IndexOutOfBoundsException exception) { return "陣列越界異常"; } }
增加一個異常方法測試,由於區域性異常優先順序更高先註釋掉了
@RestController public class ExceptionController { @GetMapping("exceptionA") public void methodA() { int a = 100 / 0; } @GetMapping("exceptionB") public void methodB() { List list = new ArrayList<>(); System.out.println(list.get(0)); } /** * 區域性例外處理 */ //@ExceptionHandler(Exception.class) //public String exHandler(Exception e) { // // 判斷髮生異常的型別是除0異常則做出響應 // if (e instanceof ArithmeticException) { // return "發生了除0異常"; // } // // 未知的異常做出響應 // return "發生了未知異常"; //} }
全域性異常註解已生效
自定義異常只需要繼承exception
類或其子類
@Data @NoArgsConstructor public class CustomException extends Exception { private static final long serialVersionUID = 1L; private Integer code; private String mes; /** * @param code 狀態碼 * @param msg 異常返回資訊 * @description 構造器 */ public CustomException(Integer code, String msg) { super(msg); this.code = code; } }
使用時可以直接丟擲異常物件
@GetMapping("exceptionC") public void methodC() throws CustomException { int a = 1; if (a == 1) { throw new CustomException(10086, "自定義異常"); } }
實際開發中我們需要封裝統一的響應物件,區分狀態碼和資訊,以便前端處理。
一般包含狀態碼,錯誤資訊,資料等。
自定義一些方法用來返回資訊,比如我定義的success(),failed()方法
@Data @NoArgsConstructor @AllArgsConstructor public class R<T> { /** * 返回狀態碼 */ private Integer code; /** * 返回資訊 */ private String msg; /** * 資料 */ private T data; public static R success() { return new R(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMsg(), null); } public static R success(Object data) { return new R(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMsg(), data); } public static R failed() { return new R(ResultCode.FAILED.getCode(), ResultCode.FAILED.getMsg(), null); } public static R failed(String msg) { return new R(ResultCode.FAILED.getCode(), msg, null); } public static R failed(int code, String msg) { return new R(code, msg, null); } }
列舉一些常用的狀態資訊
我就舉個例子,只列舉2個,根據需要去自定義
@NoArgsConstructor @AllArgsConstructor public enum ResultCode { SUCCESS(200, "請求成功"), FAILED(500, "伺服器錯誤"); private int code; private String msg; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
使用時直接返回定義的物件型別就行了,將定義的全域性異常返回型別也改成統一的響應物件
@RestControllerAdvice public class DefaultException { @ExceptionHandler({CustomException.class}) public R exception(CustomException e) { return R.failed(e.getCode(),e.getMessage()); } @ExceptionHandler({Exception.class}) public R exception(Exception e) { return R.failed(e.getMessage()); } }
全域性異常和響應物件的簡單介紹就這樣了,歡迎補充指正。
gitee地址:gitee.com/rainscloud/…
到此這篇關於springboot 全域性例外處理和統一響應物件的文章就介紹到這了,更多相關springboot全域性例外處理內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45