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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:
相關(guān)文章
關(guān)于json解析多層嵌套并轉(zhuǎn)為對應(yīng)類(List)
在進行JSON解析時,遇到多層嵌套結(jié)構(gòu)可通過遞歸或?qū)S脦靵韺崿F(xiàn),重要的是將嵌套的JSON對象準確轉(zhuǎn)化為對應(yīng)的Java類,通常需要依賴如Gson或Jackson等庫,將JSONObject轉(zhuǎn)為JavaBean時,關(guān)注字段匹配與數(shù)據(jù)類型轉(zhuǎn)換2024-10-10myatisplus的saveOrUpdate的提交總是update問題
這篇文章主要介紹了myatisplus的saveOrUpdate的提交總是update問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11@DynamicUpdate //自動更新updatetime的問題
這篇文章主要介紹了@DynamicUpdate //自動更新updatetime的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07Idea實現(xiàn)接口的方法上無法添加@Override注解的解決方案
文章介紹了在IDEA中實現(xiàn)接口方法時無法添加@Override注解的問題及其解決方法,主要步驟包括更改項目結(jié)構(gòu)中的Language level到支持該注解的版本,以及在pom.xml文件中指定maven-compiler-plugin的版本以解決自動更新后的問題2025-02-02springboot中pom.xml文件注入test測試依賴時報錯的解決
這篇文章主要介紹了springboot中pom.xml文件注入test測試依賴時報錯的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03