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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【springboot异常处理】用异常信息枚举类处理异常,使用自定义异常封装异常对象,返回统一异常处理结果

發布時間:2024/9/30 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【springboot异常处理】用异常信息枚举类处理异常,使用自定义异常封装异常对象,返回统一异常处理结果 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.目錄:

    • 異常信息枚舉類
    • 自定義異常類
    • 自定義響應數據
    • 全局異常處理類
    • 測試
  • 總結

異常信息枚舉類

由于在業務中,有很多異常,針對不同的業務,可能給出的提示信息不同,所以為了方便項目異常信息管理,我們一般會定義一個異常信息枚舉類。

public enum BusinessMsgEnum {/** 參數異常*/PARMETER_EXCEPTION("102", "參數異常!"),/** 等待超時*/SERVICE_TIME_OUT("103", "服務調用超時!"),/** 參數過大*/PARMETER_BIG_EXCEPTION("102", "輸入的圖片數量不能超過50 張!"),/** 500 : 一勞永逸的提示也可以在這定義*/UNEXPECTED_EXCEPTION("500", "系統發生異常,請聯系管理員!"); // 還可以定義更多的業務異常/*** 消息碼*/private String code;/*** 消息內容*/private String msg;private BusinessMsgEnum(String code, String msg) {this.code = code;this.msg = msg;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}// set get 方法 }

自定義異常類

public class BusinessErrorException extends RuntimeException{private static final long serialVersionUID = -7480022450501760611L;/*** 異常碼*/private String code;/*** 異常提示信息*/private String message;public BusinessErrorException(BusinessMsgEnum businessMsgEnum) {this.code = businessMsgEnum.getCode();this.message = businessMsgEnum.getMsg();} // 在構造方法中,傳入我們上面自定義的異常枚舉類,所以在項目中,如果有新的異常信 // 息需要添加,我們直接在枚舉類中添加即可,很方便,做到統一維護,然后再攔截該異 // 常時獲取即可。public String getCode() {return code;}public void setCode(String code) {this.code = code;}@Overridepublic String getMessage() {return message;}public void setMessage(String message) {this.message = message;} }

自定義響應數據

@Data @JsonInclude(value = JsonInclude.Include.NON_NULL)//這樣配置了以后為null的數據就不會再返回給前端了。比如data為null時前端不會收到data這一數據public class JSONResult {/**** @Description: 自定義響應數據結構* 這個類是提供給門戶,ios,安卓,微信商城用的* 門戶接受此類數據后需要使用本類的方法轉換成對于的數據類型格式(類,或者list)* 其他自行處理* 200:表示成功* 500:表示錯誤,錯誤信息在msg字段中* 501:bean驗證錯誤,不管多少個錯誤都以map形式返回* 502:攔截器攔截到用戶token出錯* 555:異常拋出信息* Copyright: Copyright (c) 2016* Company:Nathan.Lee.Salvatore*/// 定義jackson對象private final ObjectMapper MAPPER = new ObjectMapper();// 響應業務狀態private Integer status;// 響應消息private String msg;// 響應中的數據private Object data;private String ok; // 不使用public JSONResult build(Integer status, String msg, Object data) {return new JSONResult(status, msg, data);}public JSONResult ok(Object data) {return new JSONResult(data);}public JSONResult ok() {return new JSONResult(null);}public JSONResult errorMsg(String msg) {return new JSONResult(500, msg, null);}public JSONResult errorMap(Object data) {return new JSONResult(501, "error", data);}public JSONResult errorTokenMsg(String msg) {return new JSONResult(502, msg, null);}public JSONResult errorException(String msg) {return new JSONResult(555, msg, null);}public JSONResult() {}// public static LeeJSONResult build(Integer status, String msg) { // return new LeeJSONResult(status, msg, null); // }public JSONResult(Integer status, String msg, Object data) {this.status = status;this.msg = msg;this.data = data;}public JSONResult(Integer status, String msg) {this.status = status;this.msg = msg;}public JSONResult(Object data) {this.status = 200;this.msg = "OK";this.data = data;}public Boolean isOK() {return this.status == 200;}public Integer getStatus() {return status;}public void setStatus(Integer status) {this.status = status;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}/**** @Description: 將json結果集轉化為LeeJSONResult對象* 需要轉換的對象是一個類* @param jsonData* @param clazz* @return**/public JSONResult formatToPojo(String jsonData, Class<?> clazz) {try {if (clazz == null) {return MAPPER.readValue(jsonData, JSONResult.class);}JsonNode jsonNode = MAPPER.readTree(jsonData);JsonNode data = jsonNode.get("data");Object obj = null;if (clazz != null) {if (data.isObject()) {obj = MAPPER.readValue(data.traverse(), clazz);} else if (data.isTextual()) {obj = MAPPER.readValue(data.asText(), clazz);}}return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);} catch (Exception e) {return null;}}/**** @Description: 沒有object對象的轉化* @param json* @return**/public JSONResult format(String json) {try {return MAPPER.readValue(json, JSONResult.class);} catch (Exception e) {e.printStackTrace();}return null;}/**** @Description: Object是集合轉化* 需要轉換的對象是一個list* @param jsonData* @param clazz* @return**/public JSONResult formatToList(String jsonData, Class<?> clazz) {try {JsonNode jsonNode = MAPPER.readTree(jsonData);JsonNode data = jsonNode.get("data");Object obj = null;if (data.isArray() && data.size() > 0) {obj = MAPPER.readValue(data.traverse(),MAPPER.getTypeFactory().constructCollectionType(List.class, clazz));}return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);} catch (Exception e) {return null;}}public String getOk() {return ok;}public void setOk(String ok) {this.ok = ok;}}

全局異常處理類

全局異常處理類,使用@ControllerAdvice來表示它為全局異常
@ControllerAdvice 注解包含了@Component 注解,說明在Spring Boot 啟動時,也會把該類作為組件交給Spring 來管理。除此之外,該注解還有個basePackages 屬性,該屬性是用來攔截哪個包中的異常信息,一般我們不指定這個屬性,我們攔截項目工程中的所有異常
@ResponseBody 注解是為了異常處理完之后給調用方輸出一個json 格式的封裝數據。
在項目中如何使用呢?Spring Boot 中很簡單,在方法上通過@ExceptionHandler 注解來指定具體的異常,然后在方法中處理該異常信息,最后將結過統一的json 結構體返回給調用者。

@ControllerAdvice @ResponseBody //全局異常處理類,使用@ControllerAdvice來表示它為全局異常 //@ControllerAdvice 注解包含了@Component 注解,說明在Spring Boot 啟動時,也會把該類作為組件交給Spring 來管理。除此之外,該注解還有個basePackages 屬性,該屬性是用來攔截哪個包中的異常信息,一般我們不指定這個屬性,我們攔截項目工程中的所有異常public class GlobalExceptionHandler {// 打印logprivate static final Logger logger =LoggerFactory.getLogger(ExceptionHandler.class);/*** 缺少請求參數異常* @param ex HttpMessageNotReadableException* @return*/@ExceptionHandler(MissingServletRequestParameterException.class)@ResponseStatus(value = HttpStatus.BAD_REQUEST)public JSONResult handleHttpMessageNotReadableException(MissingServletRequestParameterException ex) {logger.error("缺少請求參數,{}", ex.getMessage());return new JSONResult(400, "缺少必要的請求參數");}@ExceptionHandler(NullPointerException.class)//空指針異常@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)public JSONResult handleTypeMismatchException(NullPointerExceptionex) {logger.error("空指針異常,{}", ex.getMessage());return new JSONResult(500, "空指針異常了");} /* 自定義異常*/@ExceptionHandler(BusinessErrorException.class)@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)public JSONResult handleBusinessError(BusinessErrorException ex) {String code = ex.getCode();String message = ex.getMessage();return new JSONResult(Integer.parseInt(code), message);}}

測試

定義一個controller測試類用于測試剛才定義的異常。

@RestController public class ExceptionController {private static final Logger logger =LoggerFactory.getLogger(ExceptionController.class);// 在業務代碼中,我們可以直接模擬一下拋出業務異常,測試一下@GetMapping("/business")public JSONResult testException() {try {int i = 1 / 0;} catch (Exception e) {throw newBusinessErrorException(BusinessMsgEnum.UNEXPECTED_EXCEPTION);}return new JSONResult();}}

總結

此文主要講解了Spring Boot 的全局異常處理,包括異常信息的封裝、異常信息的捕獲和處理,以及在實際項目中,我們用到的自定義異常枚舉類和業務異常的捕獲與處理,在項目中運用的非常廣泛,基本上每個項目中都需要做全局異常處理。

總結

以上是生活随笔為你收集整理的【springboot异常处理】用异常信息枚举类处理异常,使用自定义异常封装异常对象,返回统一异常处理结果的全部內容,希望文章能夠幫你解決所遇到的問題。

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