springboot全局異常處理方式@ControllerAdvice和@ExceptionHandler
更新時間:2024年11月11日 14:28:00 作者:比嗨皮兔
文章總結(jié)了個人在處理全局異常處理時的經(jīng)驗,包括使用`StatusEnum`來定義狀態(tài)碼,旨在為讀者提供參考,并鼓勵大家支持腳本之家
springboot全局異常處理方式
GlobalException
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@Slf4j
@ResponseBody
@ControllerAdvice
public class GlobalException {
/**
* 系統(tǒng)異常處理
*
* @param ex 異常
* @return
*/
@ExceptionHandler(value = Throwable.class)
public Result defaultErrorHandler(Exception ex) {
log.error("系統(tǒng)異常:{}", ex);
return Result.error(StatusEnum.SYSTEM_ERROR);
}
/**
* BindException
*
* @param e 異常
* @return
*/
@ExceptionHandler(BindException.class)
public Result handleBingException(BindException e) {
FieldError fieldError = e.getFieldError();
String message = fieldError.getDefaultMessage();
return Result.error(StatusEnum.SYSTEM_ERROR);
}
/**
* 處理 @RequestBody參數(shù)校驗異常
*
* @param e 異常信息
* @return
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
FieldError fieldError = bindingResult.getFieldError();
String code = fieldError.getCode();
String message = fieldError.getDefaultMessage();
return Result.error(errorCode, message);
}
}result
@Data
public class Result<T> {
/**
* 狀態(tài)值
*/
private Boolean status;
/**
* 狀態(tài)碼
*/
private String code;
/**
* 狀態(tài)信息
*/
private String message;
/**
* 返回的結(jié)果
*/
private T result;
/**
* 構(gòu)造函數(shù)
*
* @param code 狀態(tài)碼
* @param message 提示信息
*/
public Result(String code, String message) {
this.status = false;
this.code = code;
this.message = message;
}
/**
* 構(gòu)造函數(shù)
*
* @param status 狀態(tài)
* @param code 狀態(tài)碼
* @param message 提示信息
*/
public Result(Boolean status, String code, String message) {
this.status = status;
this.code = code;
this.message = message;
}
/**
* 構(gòu)造函數(shù)
*
* @param status 狀態(tài)
* @param code 狀態(tài)碼
* @param message 提示信息
* @param result 結(jié)果
*/
public Result(Boolean status, String code, String message, T result) {
this.status = status;
this.code = code;
this.message = message;
this.result = result;
}
// --------- 靜態(tài)方法 ----------
/**
* 枚舉的狀態(tài)碼
*/
private static final String CODE;
/**
* 枚舉的提示信息
*/
private static final String MESSAGE;
/**
* 500
*/
private static final String ERROR_CODE;
/**
* 成功返回的狀態(tài)碼
*/
private static final String SUCCESS_CODE;
/**
* 成功返回的狀態(tài)信息
*/
private static final String SUCCESS_MSG;
/**
* 靜態(tài)代碼塊初始化
*/
static {
// 成功返回的狀態(tài)碼
CODE = "getCode";
// 枚舉的提示信息
MESSAGE = "getMessage";
// 異常碼
ERROR_CODE = "500";
// 成功返回的狀態(tài)碼
SUCCESS_CODE = "200";
// 成功返回的狀態(tài)信息
SUCCESS_MSG = "操作成功";
}
/**
* 操作成功
*
* @return 返回結(jié)果
*/
public static Result success() {
return new Result(true, SUCCESS_CODE, SUCCESS_MSG);
}
/**
* 操作成功
*
* @return 返回結(jié)果
*/
public static <T> Result success(T result) {
return new Result(true, SUCCESS_CODE, SUCCESS_MSG, result);
}
/**
* 返回異常的
*
* @param t 泛型枚舉
* @param <T> 泛型
* @return 返回 result
*/
public static <T extends Enum> Result error(T t) {
return error(t, CODE, MESSAGE, null);
}
/**
* 返回異常的
*
* @param t 泛型枚舉
* @param message 提示信息
* @param <T> 泛型
* @return 返回 result
*/
public static <T extends Enum> Result error(T t, String message) {
return error(t, CODE, MESSAGE, message);
}
/**
* 返回異常的
*
* @param code 狀態(tài)碼
* @return 返回 result
*/
public static Result error(String code) {
return new Result(code, null);
}
/**
* 返回異常的
*
* @param code 狀態(tài)碼
* @param message 提示信息
* @return 返回 result
*/
public static Result error(String code, String message) {
return new Result(code, message);
}
/**
* 返回異常的
*
* @param t 返回的枚舉
* @param codeMethod 狀態(tài)的方法
* @param msgMethod 提示信息的狀態(tài)碼
* @param <T> 泛型
* @return 返回 result 對象
*/
public static <T extends Enum> Result error(T t, String codeMethod, String msgMethod, String message) {
try {
Class<?> aClass = t.getClass();
String code = aClass.getMethod(codeMethod).invoke(t).toString();
message = StringUtils.isEmpty(message) ? aClass.getMethod(msgMethod).invoke(t).toString() : message;
return new Result(code, message);
} catch (Exception e) {
return new Result(ERROR_CODE, e.getMessage());
}
}
// ---- 重寫的方法 ----
/**
* 重寫 toString 方法
*
* @return 返回JSON字符串
*/
@Override
public String toString() {
return JSON.toJSONString(this);
}
/**
* toJsonString 方法
*
* @return 返回JSON字符串
*/
public String toJsonString() {
return JSON.toJSONString(this);
}
}StatusEnum
public enum StatusEnum {
/**
* 操作成功
*/
OK("200", "操作成功"),
/**
* 沒有訪問權(quán)限
*/
NOT_PERMISSION("403", "沒有訪問權(quán)限"),
/**
* 沒有登錄或者登錄已經(jīng)過期
*/
NOT_LOGIN("405", "沒有登錄或者登錄已經(jīng)過期"),
/**
* 系統(tǒng)繁忙,請稍后再試
*/
SYSTEM_ERROR("500", "系統(tǒng)繁忙,請稍后再試");
/**
* 構(gòu)造函數(shù)
*
* @param code 狀態(tài)碼
* @param message 提示信息
*/
StatusEnum(String code, String message) {
this.code = code;
this.message = message;
}
/**
* 狀態(tài)碼
*/
private String code;
/**
* 提示信息
*/
private String message;
/**
* 獲取 狀態(tài)碼
*
* @return 狀態(tài)碼
*/
public String getCode() {
return code;
}
/**
* 獲取 提示信息
*
* @return 提示信息
*/
public String getMessage() {
return message;
}
}總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- springboot中的controller參數(shù)映射問題小結(jié)
- springboot中Controller內(nèi)文件上傳到本地及阿里云操作方法
- springboot的統(tǒng)一異常處理,使用@RestControllerAdvice詳解
- springboot如何通過controller層實(shí)現(xiàn)頁面切換
- springboot Controller直接返回String類型帶來的亂碼問題及解決
- SpringBoot之controller參數(shù)校驗詳解
- SpringBoot如何實(shí)現(xiàn)調(diào)用controller和Service層方法
相關(guān)文章
關(guān)于json解析多層嵌套并轉(zhuǎn)為對應(yīng)類(List)
在進(jìn)行JSON解析時,遇到多層嵌套結(jié)構(gòu)可通過遞歸或?qū)S脦靵韺?shí)現(xiàn),重要的是將嵌套的JSON對象準(zhǔn)確轉(zhuǎn)化為對應(yīng)的Java類,通常需要依賴如Gson或Jackson等庫,將JSONObject轉(zhuǎn)為JavaBean時,關(guān)注字段匹配與數(shù)據(jù)類型轉(zhuǎn)換2024-10-10
myatisplus的saveOrUpdate的提交總是update問題
這篇文章主要介紹了myatisplus的saveOrUpdate的提交總是update問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11
@DynamicUpdate //自動更新updatetime的問題
這篇文章主要介紹了@DynamicUpdate //自動更新updatetime的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
Idea實(shí)現(xiàn)接口的方法上無法添加@Override注解的解決方案
文章介紹了在IDEA中實(shí)現(xiàn)接口方法時無法添加@Override注解的問題及其解決方法,主要步驟包括更改項目結(jié)構(gòu)中的Language level到支持該注解的版本,以及在pom.xml文件中指定maven-compiler-plugin的版本以解決自動更新后的問題2025-02-02
springboot中pom.xml文件注入test測試依賴時報錯的解決
這篇文章主要介紹了springboot中pom.xml文件注入test測試依賴時報錯的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03

