日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot的全局异常处理的优雅吃法!要进来学习下吗

發布時間:2025/3/19 javascript 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot的全局异常处理的优雅吃法!要进来学习下吗 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

SpringBoot的全局異常處理的優雅吃法!要進來學習下嗎

SpringBoot全局異常準備
開發準備
環境要求 JDK :1.8 SpringBoot :1.5.17.RELEASE

首先還是Maven的相關依賴:

<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.8</java.version><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.17.RELEASE</version><relativePath /></parent><dependencies><!-- Spring Boot Web 依賴 核心 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Boot Test 依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.41</version></dependency></dependencies>

配置文件這塊基本不需要更改,全局異常的處理只需在代碼中實現即可。

代碼編寫
SpringBoot的項目已經對有一定的異常處理了,但是對于我們開發者而言可能就不太合適了,因此我們需要對這些異常進行統一的捕獲并處理。SpringBoot中有一個 ControllerAdvice 的注解,使用該注解表示開啟了全局異常的捕獲,我們只需在自定義一個方法使用 ExceptionHandler 注解然后定義捕獲異常的類型即可對這些捕獲的異常進行統一的處理。

我們根據下面的這個示例來看該注解是如何使用吧。

示例代碼:

@ControllerAdvice public class MyExceptionHandler {@ExceptionHandler(value =Exception.class)public String exceptionHandler(Exception e){System.out.println("未知異常!原因是:"+e);return e.getMessage();} }

上述的示例中,我們對捕獲的異常進行簡單的二次處理,返回異常的信息,雖然這種能夠讓我們知道異常的原因,但是在很多的情況下來說,可能還是不夠人性化,不符合我們的要求。那么我們這里可以通過自定義的異常類以及枚舉類來實現我們想要的那種數據吧。

自定義基礎接口類

首先定義一個基礎的接口類,自定義的錯誤描述枚舉類需實現該接口。 代碼如下:

public interface BaseErrorInfoInterface {/** 錯誤碼*/String getResultCode();/** 錯誤描述*/String getResultMsg(); }

自定義枚舉類

然后我們這里在自定義一個枚舉類,并實現該接口。 代碼如下:

public enum CommonEnum implements BaseErrorInfoInterface {// 數據操作錯誤定義SUCCESS("200", "成功!"), BODY_NOT_MATCH("400","請求的數據格式不符!"),SIGNATURE_NOT_MATCH("401","請求的數字簽名不匹配!"),NOT_FOUND("404", "未找到該資源!"), INTERNAL_SERVER_ERROR("500", "服務器內部錯誤!"),SERVER_BUSY("503","服務器正忙,請稍后再試!");/** 錯誤碼 */private String resultCode;/** 錯誤描述 */private String resultMsg;CommonEnum(String resultCode, String resultMsg) {this.resultCode = resultCode;this.resultMsg = resultMsg;}@Overridepublic String getResultCode() {return resultCode;}@Overridepublic String getResultMsg() {return resultMsg;}}

自定義異常類

然后我們在來自定義一個異常類,用于處理我們發生的業務異常。 代碼如下:

public class BizException extends RuntimeException {private static final long serialVersionUID = 1L;/*** 錯誤碼*/protected String errorCode;/*** 錯誤信息*/protected String errorMsg;public BizException() {super();}public BizException(BaseErrorInfoInterface errorInfoInterface) {super(errorInfoInterface.getResultCode());this.errorCode = errorInfoInterface.getResultCode();this.errorMsg = errorInfoInterface.getResultMsg();}public BizException(BaseErrorInfoInterface errorInfoInterface, Throwable cause) {super(errorInfoInterface.getResultCode(), cause);this.errorCode = errorInfoInterface.getResultCode();this.errorMsg = errorInfoInterface.getResultMsg();}public BizException(String errorMsg) {super(errorMsg);this.errorMsg = errorMsg;}public BizException(String errorCode, String errorMsg) {super(errorCode);this.errorCode = errorCode;this.errorMsg = errorMsg;}public BizException(String errorCode, String errorMsg, Throwable cause) {super(errorCode, cause);this.errorCode = errorCode;this.errorMsg = errorMsg;}public String getErrorCode() {return errorCode;}public void setErrorCode(String errorCode) {this.errorCode = errorCode;}public String getErrorMsg() {return errorMsg;}public void setErrorMsg(String errorMsg) {this.errorMsg = errorMsg;}public String getMessage() {return errorMsg;}@Overridepublic Throwable fillInStackTrace() {return this;}}

自定義數據格式

順便這里我們定義一下數據的傳輸格式。 代碼如下:

public class ResultBody {/*** 響應代碼*/private String code;/*** 響應消息*/private String message;/*** 響應結果*/private Object result;public ResultBody() {}public ResultBody(BaseErrorInfoInterface errorInfo) {this.code = errorInfo.getResultCode();this.message = errorInfo.getResultMsg();}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Object getResult() {return result;}public void setResult(Object result) {this.result = result;}/*** 成功* * @return*/public static ResultBody success() {return success(null);}/*** 成功* @param data* @return*/public static ResultBody success(Object data) {ResultBody rb = new ResultBody();rb.setCode(CommonEnum.SUCCESS.getResultCode());rb.setMessage(CommonEnum.SUCCESS.getResultMsg());rb.setResult(data);return rb;}/*** 失敗*/public static ResultBody error(BaseErrorInfoInterface errorInfo) {ResultBody rb = new ResultBody();rb.setCode(errorInfo.getResultCode());rb.setMessage(errorInfo.getResultMsg());rb.setResult(null);return rb;}/*** 失敗*/public static ResultBody error(String code, String message) {ResultBody rb = new ResultBody();rb.setCode(code);rb.setMessage(message);rb.setResult(null);return rb;}/*** 失敗*/public static ResultBody error( String message) {ResultBody rb = new ResultBody();rb.setCode("-1");rb.setMessage(message);rb.setResult(null);return rb;}@Overridepublic String toString() {return JSONObject.toJSONString(this);}}

自定義全局異常處理類

最后我們在來編寫一個自定義全局異常處理的類。 代碼如下:

@ControllerAdvice public class GlobalExceptionHandler {private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);/*** 處理自定義的業務異常* @param req* @param e* @return*/@ExceptionHandler(value = BizException.class) @ResponseBody public ResultBody bizExceptionHandler(HttpServletRequest req, BizException e){logger.error("發生業務異常!原因是:{}",e.getErrorMsg());return ResultBody.error(e.getErrorCode(),e.getErrorMsg());}/*** 處理空指針的異常* @param req* @param e* @return*/@ExceptionHandler(value =NullPointerException.class)@ResponseBodypublic ResultBody exceptionHandler(HttpServletRequest req, NullPointerException e){logger.error("發生空指針異常!原因是:",e);return ResultBody.error(CommonEnum.BODY_NOT_MATCH);}/*** 處理其他異常* @param req* @param e* @return*/@ExceptionHandler(value =Exception.class)@ResponseBodypublic ResultBody exceptionHandler(HttpServletRequest req, Exception e){logger.error("未知異常!原因是:",e);return ResultBody.error(CommonEnum.INTERNAL_SERVER_ERROR);} }

因為這里我們只是用于做全局異常處理的功能實現以及測試,所以這里我們只需在添加一個實體類和一個控制層類即可。

實體類

又是萬能的用戶表 ( ▽ )

代碼如下:

public class User implements Serializable{private static final long serialVersionUID = 1L;/** 編號 */private int id;/** 姓名 */private String name;/** 年齡 */private int age;public User(){}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String toString() {return JSONObject.toJSONString(this);} }

Controller 控制層

控制層這邊也比較簡單,使用Restful風格實現的CRUD功能,不同的是這里我故意弄出了一些異常,好讓這些異常被捕獲到然后處理。這些異常中,有自定義的異常拋出,也有空指針的異常拋出,當然也有不可預知的異常拋出(這里我用類型轉換異常代替),那么我們在完成代碼編寫之后,看看這些異常是否能夠被捕獲處理成功吧!

代碼如下:

@RestController @RequestMapping(value = "/api") public class UserRestController {@PostMapping("/user")public boolean insert(@RequestBody User user) {System.out.println("開始新增...");//如果姓名為空就手動拋出一個自定義的異常!if(user.getName()==null){throw new BizException("-1","用戶姓名不能為空!");}return true;}@PutMapping("/user")public boolean update(@RequestBody User user) {System.out.println("開始更新...");//這里故意造成一個空指針的異常,并且不進行處理String str=null;str.equals("111");return true;}@DeleteMapping("/user")public boolean delete(@RequestBody User user) {System.out.println("開始刪除...");//這里故意造成一個異常,并且不進行處理Integer.parseInt("abc123");return true;}@GetMapping("/user")public List<User> findByUser(User user) {System.out.println("開始查詢...");List<User> userList =new ArrayList<>();User user2=new User();user2.setId(1L);user2.setName("xuwujing");user2.setAge(18);userList.add(user2);return userList;}}

App 入口

和普通的SpringBoot項目基本一樣。

代碼如下:

@SpringBootApplication public class App {public static void main( String[] args ){SpringApplication.run(App.class, args);System.out.println("程序正在運行...");} }

功能測試
我們成功啟動該程序之后,使用Postman工具來進行接口測試。

首先進行查詢,查看程序正常運行是否ok,使用GET 方式進行請求。

“GET http://localhost:8181/api/user”返回參數為:{"id":1,"name":"xuwujing","age":18}

示例圖:

可以看到程序正常返回,并沒有因自定義的全局異常而影響。

然后我們再來測試下自定義的異常是否能夠被正確的捕獲并處理。

使用POST方式進行請求

“POST http://localhost:8181/api/user”Body參數為:{"id":1,"age":18}”返回參數為:{"code":"-1","message":"用戶姓名不能為空!","result":null}

示例圖:

可以看出將我們拋出的異常進行數據封裝,然后將異常返回出來。

然后我們再來測試下空指針異常是否能夠被正確的捕獲并處理。在自定義全局異常中,我們除了定義空指針的異常處理,也定義最高級別之一的Exception異常,那么這里發生了空指針異常之后,它是回優先使用哪一個呢?這里我們來測試下。

使用PUT方式進行請求。

“PUT http://localhost:8181/api/user”Body參數為:“{“id”:1,“age”:18}”返回參數為:“{“code”:“400”,“message”:“請求的數據格式不符!”,“result”:null}”

示例圖:

我們可以看到這里的的確是返回空指針的異常護理,可以得出全局異常處理優先處理子類的異常。

那么我們在來試試未指定其異常的處理,看該異常是否能夠被捕獲。

使用DELETE方式進行請求。

“DELETE http://localhost:8181/api/user”Body參數為:“{“id”:1}”返回參數為:“{“code”:“500”,“message”:“服務器內部錯誤!”,“result”:null}”

這里可以看到它使用了我們在自定義全局異常處理類中的Exception異常處理的方法。到這里,測試就結束了。順便再說一下,自義定全局異常處理除了可以處理上述的數據格式之外,也可以處理頁面的跳轉,只需在新增的異常方法的返回處理上填寫該跳轉的路徑并不使用 ResponseBody 注解即可。

細心的同學也許發現了在 GlobalExceptionHandler 類中使用的是 ControllerAdvice 注解,而非 RestControllerAdvice 注解,如果是用的 RestControllerAdvice 注解,它會將數據自動轉換成JSON格式,這種于 Controller 和 RestController 類似,所以我們在使用全局異常處理的之后可以進行靈活的選擇處理。

小結
關于SpringBoot優雅的全局異常處理的方法,就到這里啦,有什么不懂的可在評論區交流,如有不妥,歡迎指正!

碼字不易 請大家給我點贊+關注+評論!一條龍

文章來源:https://www.jianshu.com/p/dc99ffc6117d

我是Remi醬~~

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的SpringBoot的全局异常处理的优雅吃法!要进来学习下吗的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中文字幕亚洲日本 | 亚洲激情在线播放 | 一级黄色片免费播放 | 国产女人高潮视频 | 人人草人人搞 | 成人97| 久久久99精品国产一区二区三区 | 浓精喷进老师黑色丝袜在线观看 | 五月天青青草 | 成人免费看片载 | 欧美黄片一区二区三区 | 成人免费网址 | 色人人| 欧美男女性生活视频 | 在线免费观看国产 | 精品久久久久久久免费人妻 | 青娱乐超碰在线 | 日本孕妇孕交 | 久久久全国免费视频 | 日本一级二级视频 | 浪漫樱花在线观看高清动漫 | 中文字幕在线视频免费观看 | 久久久久久久久久艹 | 亚洲av综合av一区二区三区 | 性三级视频 | av一区二区在线播放 | 噼里啪啦免费高清看 | 蜜桃tv在线观看 | 欧美美女黄色 | 波多野结衣一级 | 狠狠91 | 中文字幕永久在线播放 | av首页在线观看 | 国产男男gay体育生白袜 | 欧美日韩色图片 | 在线观看a网站 | 午夜极品视频 | 影音先锋在线播放 | 日韩欧美三级视频 | 久久久精品人妻一区二区三区 | 亚洲性综合 | 91片看 | 伊人久久大香线 | 亚洲精品免费在线观看视频 | 国产精品精品国产 | 精品少妇人妻av一区二区 | 悟空影视大全免费高清观看在线 | 亚洲欧美日本另类 | 日韩国产亚洲欧美 | 风韵少妇spa私密视频 | 欧美中文字幕一区二区 | 亚洲最大成人综合网 | 伊人55| 亚洲熟女www一区二区三区 | 亚洲天堂小说 | 国产卡一卡二卡三无线乱码新区 | 国产一区色 | 精彩视频一区二区 | 豆豆色成人网 | 国产精品99久久久精品无码 | 色伊人av| 牛牛视频在线观看 | 成人一卡二卡 | 日本不卡一二三区 | 天堂亚洲精品 | 日本公妇乱淫免费视频一区三区 | 蜜臀尤物一区二区三区直播 | 丁香婷婷久久久综合精品国产 | 九色影视| 亚洲激情国产 | 成人播放器 | 粉嫩av一区二区白浆 | jizz高潮 | 91视频com| 91干| 成人乱人乱一区二区三区一级视频 | 毛片在线播放视频 | 色狠狠操| missav在线 | 国产成人无码网站 | 成年人福利 | 91麻豆产精品久久久久久 | 狠狠躁日日躁 | av黄色网 | 成年人网站黄色 | 精品黑人| 少妇色欲网 | av一区二区三区免费观看 | 激情第四色 | 久久婷婷热| 免费在线不卡视频 | 国产青青视频 | 亚欧成人精品 | 国产精品精东影业 | 韩国一区二区三区视频 | 日韩123| 男女无遮挡网站 | 亚洲图片欧美日韩 | 特黄大片又粗又大又暴 |