springboot?全局異常處理和統(tǒng)一響應(yīng)對(duì)象的處理方式
springboot異常處理
SpringBoot 默認(rèn)的異常處理機(jī)制
默認(rèn)情況,SpringBoot 提供兩種不同響應(yīng)方式
- 一種是瀏覽器客戶端請(qǐng)求一個(gè)不存在的頁(yè)面或服務(wù)端異常時(shí),SpringBoot默認(rèn)會(huì)響應(yīng)一個(gè)
html - 另一種是使用
postman等調(diào)試工具請(qǐng)求不存在的url或服務(wù)端異常時(shí),默認(rèn)返回json信息
SpringBoot 全局異常處理
一般我們不會(huì)將錯(cuò)誤信息返回前端,自己去try catch捕獲異常,但有個(gè)問題:每個(gè)方法都這樣捕獲異常,肯定是不合適,這是我們就需要全局的異常處理了。
@RestController
public class ExceptionController {
@GetMapping("exceptionA")
public void methodA() {
try {
int a = 100 / 0;
} catch (Exception e) {
e.printStackTrace();
}
}
}1. 局部異常處理
使用@EceptionHandle注解實(shí)現(xiàn)某個(gè)類的局部異常處理
@RestController
public class ExceptionController {
@GetMapping("exceptionA")
public void methodA() {
int a = 100 / 0;
}
/**
* 局部異常處理
*/
@ExceptionHandler(Exception.class)
public String exHandler(Exception e) {
// 判斷發(fā)生異常的類型是除0異常則做出響應(yīng)
if (e instanceof ArithmeticException) {
return "發(fā)生了除0異常";
}
// 未知的異常做出響應(yīng)
return "發(fā)生了未知異常";
}
}2. 全局異常處理
使用@ControllerAdvice +@ExceptionHandler注解實(shí)現(xiàn)全局異常處理
自定義一個(gè)異常類
@RestControllerAdvice
public class DefaultException {
?
@ExceptionHandler({NullPointerException.class})
public String exception(NullPointerException exception) {
return "空指針異常";
?
}
?
@ExceptionHandler({IndexOutOfBoundsException.class})
public String exception(IndexOutOfBoundsException exception) {
return "數(shù)組越界異常";
}
}增加一個(gè)異常方法測(cè)試,由于局部異常優(yōu)先級(jí)更高先注釋掉了
@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) {
// // 判斷發(fā)生異常的類型是除0異常則做出響應(yīng)
// if (e instanceof ArithmeticException) {
// return "發(fā)生了除0異常";
// }
// // 未知的異常做出響應(yīng)
// return "發(fā)生了未知異常";
//}
}全局異常注解已生效
自定義異常
自定義異常只需要繼承exception類或其子類
@Data
@NoArgsConstructor
public class CustomException extends Exception {
?
private static final long serialVersionUID = 1L;
?
private Integer code;
?
private String mes;
?
/**
* @param code 狀態(tài)碼
* @param msg 異常返回信息
* @description 構(gòu)造器
*/
public CustomException(Integer code, String msg) {
super(msg);
this.code = code;
}
}使用時(shí)可以直接拋出異常對(duì)象
@GetMapping("exceptionC")
public void methodC() throws CustomException {
int a = 1;
if (a == 1) {
throw new CustomException(10086, "自定義異常");
}
}統(tǒng)一響應(yīng)對(duì)象
實(shí)際開發(fā)中我們需要封裝統(tǒng)一的響應(yīng)對(duì)象,區(qū)分狀態(tài)碼和信息,以便前端處理。
定義統(tǒng)一的響應(yīng)對(duì)象
一般包含狀態(tài)碼,錯(cuò)誤信息,數(shù)據(jù)等。
自定義一些方法用來(lái)返回信息,比如我定義的success(),failed()方法
@Data
@NoArgsConstructor
@AllArgsConstructor
public class R<T> {
/**
* 返回狀態(tài)碼
*/
private Integer code;
/**
* 返回信息
*/
private String msg;
/**
* 數(shù)據(jù)
*/
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);
}
}
枚舉信息
枚舉一些常用的狀態(tài)信息
我就舉個(gè)例子,只枚舉2個(gè),根據(jù)需要去自定義
@NoArgsConstructor
@AllArgsConstructor
public enum ResultCode {
?
SUCCESS(200, "請(qǐng)求成功"),
FAILED(500, "服務(wù)器錯(cuò)誤");
?
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;
}
}響應(yīng)對(duì)象
使用時(shí)直接返回定義的對(duì)象類型就行了,將定義的全局異常返回類型也改成統(tǒng)一的響應(yīng)對(duì)象
@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());
}
}全局異常和響應(yīng)對(duì)象的簡(jiǎn)單介紹就這樣了,歡迎補(bǔ)充指正。
gitee地址:gitee.com/rainscloud/…
到此這篇關(guān)于springboot 全局異常處理和統(tǒng)一響應(yīng)對(duì)象的文章就介紹到這了,更多相關(guān)springboot全局異常處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring的實(shí)例工廠方法和靜態(tài)工廠方法實(shí)例代碼
這篇文章主要介紹了Spring的實(shí)例工廠方法和靜態(tài)工廠方法實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
SpringBoot整合Mybatis實(shí)現(xiàn)多數(shù)據(jù)源配置與跨數(shù)據(jù)源事務(wù)實(shí)例
開發(fā)中經(jīng)常有這樣的需要: 讀寫分離。微服務(wù)環(huán)境下可以實(shí)現(xiàn)一個(gè)服務(wù)讀取一個(gè)數(shù)據(jù)庫(kù),另一個(gè)服務(wù)寫庫(kù)。但是在實(shí)際應(yīng)用中有時(shí)也需要在一個(gè)服務(wù)中讀寫不同的數(shù)據(jù)庫(kù)??梢栽谝粋€(gè)SpringBoot單體項(xiàng)目中配置多個(gè)數(shù)據(jù)源解決讀寫庫(kù)分離2022-11-11
數(shù)組實(shí)現(xiàn)Java 自定義Queue隊(duì)列及應(yīng)用操作
這篇文章主要介紹了數(shù)組實(shí)現(xiàn)Java 自定義Queue隊(duì)列及應(yīng)用操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
MyBatis-Plus雪花算法實(shí)現(xiàn)源碼解讀
雪花算法是一種用于生成唯一標(biāo)識(shí)符(ID)的分布式算法,雪花算法的設(shè)計(jì)目標(biāo)是在分布式系統(tǒng)中生成全局唯一的ID,同時(shí)保證ID的有序性和趨勢(shì)遞增,這篇文章主要介紹了MyBatis-Plus雪花算法實(shí)現(xiàn)源碼解析,需要的朋友可以參考下2023-12-12
MyBatis使用注解開發(fā)實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了MyBatis使用注解開發(fā)實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
Windows 10上JDK環(huán)境安裝配置圖文教程
這篇文章主要為大家詳細(xì)介紹了Windows 10上JDK環(huán)境安裝配置圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
SSH框架網(wǎng)上商城項(xiàng)目第12戰(zhàn)之添加和更新商品功能
這篇文章主要介紹了SSH框架網(wǎng)上商城項(xiàng)目第12戰(zhàn)之添加和更新商品功能的實(shí)現(xiàn)代碼,感興趣的小伙伴們可以參考一下2016-06-06
Spring如何基于xml實(shí)現(xiàn)聲明式事務(wù)控制
這篇文章主要介紹了Spring如何基于xml實(shí)現(xiàn)聲明式事務(wù)控制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10

