javascript
如何优雅的处理异常?SpringBoot全局异常与数据校验
要思考的問題
在現在的前后端交互中,通常都規范了接口返回方式,如返回的接口狀態(成功|失敗)以及要返回的數據在那個字段取,或者說失敗了以后提示信息從接口哪里返回,因此,如果想做全局異常,并且異常發生后能準確的返回給前端解析,那么需要異常發生時返回給前端的格式與正常失敗場景的格式一致。
項目建立
利用idea 工具,很容易的搭建一個SpringBoot項目,要引入的maven依賴如下:
<groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> 復制代碼 <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> 復制代碼 <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope> 復制代碼很簡單,除了加入web功能還加入了我們需要用到的JSR-303校驗框架。
定義成功失敗 返回碼
public class Code {
/*** 成功*/public static int SUCCESSED = 1;/*** 失敗*/public static int FAILED = -1; 復制代碼}
定義接口返回響應實體
public class Response implements Serializable{
/**
* */ 復制代碼private static final long serialVersionUID = 4250719891313555820L;
/**
* 返回結果集*/ 復制代碼private T result;
/**
* 返回消息*/ 復制代碼private String msg;
/**
* 響應碼*/ 復制代碼private Integer code;
//set get 略
}
全局異常攔截和驗證
定義自定義業務異常
public class MyException extends RuntimeException {
private static final long serialVersionUID = -5875371379845226068L;public MyException(){}public MyException(String msg){this.msg = msg ;}/*** 異常信息*/private String msg ;/*** 具體異常碼*/private int code = Code.FAILED; 復制代碼get set 略
編寫全局異常控制器并對自定義異常做處理
@ControllerAdvice
public class GlobalExceptionHandler {
private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); 復制代碼@ExceptionHandler(value = MyException.class)
@ResponseBody
public Response myExceptionErrorHandler(MyException ex) throws Exception {
logger.error("myExceptionErrorHandler info:{}",ex.getMessage());Response<String> r = new Response<>();r.setMsg(ex.getMsg());r.setCode(ex.getCode());return r; 復制代碼}
編寫controller模擬拋出業務異常
@RestController
@RequestMapping("/user")
public class UserController {
@PostMapping(value = "/update")
Response update(User user){
//todo 此處為模擬異常拋出if(true){throw new MyException("更新失敗");}//todo 此處為模擬返回Response<Boolean> response = new Response<>();response.setCode(Code.SUCCESSED);response.setResult(true);return response; 復制代碼}
}
postMan模擬請求接口,進行驗證
數據綁定異常處理
通常我們操作數據的時候,不僅前端需要進行數據校驗,后端也應當進行攔截和進行相應的錯誤提示,JSR-303校驗框架也是我們的一種選擇。
編寫實體User,并對屬性進行注解控制
public class User {
@NotNull(message = "用戶名不能為空")private String userName;private int age; 復制代碼//...
全局異常控制類加入攔截
@ControllerAdvice
public class GlobalExceptionHandler {
private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);@ExceptionHandler(value = BindException.class)@ResponseBodypublic Response<String> bindExceptionErrorHandler(BindException ex) throws Exception {logger.error("bindExceptionErrorHandler info:{}",ex.getMessage());Response<String> r = new Response<>();StringBuilder sb = new StringBuilder();FieldError fieldError = ex.getFieldError();sb.append(fieldError.getDefaultMessage());r.setMsg(sb.toString());r.setCode(Code.FAILED);return r;} 復制代碼//...
編寫控制器
@RestController
@RequestMapping("/user")
public class UserController {
@PostMapping(value = "/add")Response<User> add(@Validated User user){//todo 此處為模擬返回Response<User> response = new Response<>();response.setCode(Code.SUCCESSED);response.setResult(new User());return response;} 復制代碼//...
postMan模擬請求
不填寫任何屬性,模擬添加操作,準確進行攔截和報錯
項目結構預覽:
結尾適合的才是最好的,每個團隊都應摸索出自己的一套異常解決方案,本文所提僅針對業務異常,希望大家也能有所收獲
歡迎工作一到五年的Java工程師朋友們加入Java程序員開發: 854393687
群內提供免費的Java架構學習資料(里面有高可用、高并發、高性能及分布式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!
轉載于:https://juejin.im/post/5c11cfaa6fb9a04a0604bc09
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的如何优雅的处理异常?SpringBoot全局异常与数据校验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 马斯克建议巴菲特投资特斯拉:14年前就该
- 下一篇: Spring_Bean的作用域---和使