成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何優雅的處理異常?SpringBoot全局異常與數據校驗

開發 后端
在現在的前后端交互中,通常都規范了接口返回方式,如返回的接口狀態(成功|失敗)以及要返回的數據在那個字段取,或者說失敗了以后提示信息從接口哪里返回,因此,如果想做全局異常,并且異常發生后能準確的返回給前端解析,那么需要異常發生時返回給前端的格式與正常失敗場景的格式一致。

 要思考的問題

在現在的前后端交互中,通常都規范了接口返回方式,如返回的接口狀態(成功|失敗)以及要返回的數據在那個字段取,或者說失敗了以后提示信息從接口哪里返回,因此,如果想做全局異常,并且異常發生后能準確的返回給前端解析,那么需要異常發生時返回給前端的格式與正常失敗場景的格式一致。

項目建立

利用idea 工具,很容易的搭建一個SpringBoot項目,要引入的maven依賴如下: 

  1. <dependency>  
  2.  <groupId>org.springframework.boot</groupId>  
  3.  <artifactId>spring-boot-starter-validation</artifactId>  
  4. </dependency>  
  5. <dependency>  
  6.  <groupId>org.springframework.boot</groupId>  
  7.  <artifactId>spring-boot-starter-web</artifactId>  
  8. </dependency>  
  9. <dependency>  
  10.  <groupId>org.springframework.boot</groupId>  
  11.  <artifactId>spring-boot-starter-test</artifactId>  
  12.  <scope>test</scope>  
  13. </dependency> 

很簡單,除了加入web功能還加入了我們需要用到的JSR-303校驗框架。

定義成功失敗 返回碼 

  1. public class Code {  
  2.  /**  
  3.  * 成功  
  4.  */  
  5.  public static int SUCCESSED = 1 
  6.  /**  
  7.  * 失敗  
  8.  */  
  9.  public static int FAILED = -1;  

定義接口返回響應實體 

  1. public class Response<T> implements Serializable{  
  2.  /**  
  3.  *   
  4.  */  
  5.  private static final long serialVersionUID = 4250719891313555820L 
  6.  /**  
  7.  * 返回結果集  
  8.  */  
  9.  private T result;  
  10.  /**  
  11.  * 返回消息  
  12.  */  
  13.  private String msg;  
  14.  /**  
  15.  * 響應碼  
  16.  */  
  17.  private Integer code;  
  18.  //set get 略  

全局異常攔截和驗證

定義自定義業務異常 

  1. public class MyException extends RuntimeException {  
  2.  private static final long serialVersionUID = -5875371379845226068L;  
  3.  public MyException(){}  
  4.  public MyException(String msg){  
  5.  this.msg = msg ;  
  6.  }  
  7.  /**  
  8.  * 異常信息  
  9.  */  
  10.  private String msg ;  
  11.  /**  
  12.  * 具體異常碼  
  13.  */  
  14.  private int code = Code.FAILED;  
  15.  get set 略  

編寫全局異常控制器并對自定義異常做處理 

  1. @ControllerAdvice  
  2. public class GlobalExceptionHandler {  
  3.  private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);  
  4. @ExceptionHandler(value = MyException.class)  
  5. @ResponseBody  
  6. public Response<String> myExceptionErrorHandler(MyException ex) throws Exception {  
  7.  logger.error("myExceptionErrorHandler info:{}",ex.getMessage());  
  8.  Response<String> r = new Response<>();  
  9.  r.setMsg(ex.getMsg());  
  10.  r.setCode(ex.getCode());  
  11.  return r;  

編寫controller模擬拋出業務異常 

  1. @RestController  
  2. @RequestMapping("/user")  
  3. public class UserController {  
  4. @PostMapping(value = "/update" 
  5. Response<Boolean> update(User user){  
  6.  //todo 此處為模擬異常拋出  
  7.  if(true){  
  8.  throw new MyException("更新失敗");  
  9.  }  
  10.  //todo 此處為模擬返回  
  11.  Response<Boolean> response = new Response<>();  
  12.  response.setCode(Code.SUCCESSED);  
  13.  response.setResult(true);  
  14.  return response;  
  15.  

postMan模擬請求接口,進行驗證

數據綁定異常處理

通常我們操作數據的時候,不僅前端需要進行數據校驗,后端也應當進行攔截和進行相應的錯誤提示,JSR-303校驗框架也是我們的一種選擇。

編寫實體`User`,并對屬性進行注解控制 

  1. public class User {  
  2.  @NotNull(message = "用戶名不能為空" 
  3.  private String userName;  
  4.  private int age;  
  5.  //... 

全局異常控制類加入攔截 

  1. @ControllerAdvice  
  2. public class GlobalExceptionHandler {  
  3.  private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);  
  4.  @ExceptionHandler(value = BindException.class)  
  5.  @ResponseBody  
  6.  public Response<String> bindExceptionErrorHandler(BindException ex) throws Exception {  
  7.  logger.error("bindExceptionErrorHandler info:{}",ex.getMessage());  
  8.  Response<String> r = new Response<>();  
  9.  StringBuilder sb = new StringBuilder();  
  10.  FieldError fieldError = ex.getFieldError();  
  11.  sb.append(fieldError.getDefaultMessage());  
  12.  r.setMsg(sb.toString());  
  13.  r.setCode(Code.FAILED);  
  14.  return r;  
  15.  }  
  16.  //... 

編寫控制器 

  1. @RestController  
  2. @RequestMapping("/user")  
  3. public class UserController {  
  4.  @PostMapping(value = "/add" 
  5.  Response<User> add(@Validated User user){  
  6.  //todo 此處為模擬返回  
  7.  Response<User> response = new Response<>();  
  8.  response.setCode(Code.SUCCESSED);  
  9.  response.setResult(new User());  
  10.  return response;  
  11.  }  
  12.  //... 

postMan模擬請求

不填寫任何屬性,模擬添加操作,準確進行攔截和報錯

項目結構預覽:

結尾

適合的才是***的,每個團隊都應摸索出自己的一套異常解決方案,本文所提僅針對業務異常,希望大家也能有所收獲

責任編輯:龐桂玉 來源: 今日頭條
相關推薦

2017-08-10 10:28:43

SpringBootSpring

2022-08-03 07:07:10

Spring數據封裝框架

2023-10-10 13:23:18

空指針異常Java

2022-03-04 08:31:07

Spring異常處理

2021-04-20 10:50:38

Spring Boot代碼Java

2023-12-27 07:53:08

全局異常處理處理應用

2022-05-03 10:43:43

SpringJava

2023-10-27 08:20:12

springboot微服務

2024-10-28 08:32:22

統一接口響應SpringBoot響應框架

2020-03-16 17:20:02

異常處理Spring Boot

2021-09-26 09:40:25

React代碼前端

2009-02-06 14:11:36

ASP.NET.NET全局異常處理

2019-08-29 14:30:16

代碼開發工具

2022-03-01 21:25:30

對象代碼Proxy

2024-09-26 10:51:51

2020-08-24 13:35:59

trycatchJava

2019-03-14 15:59:44

前端開發編程

2023-12-13 13:28:00

Spring全局異常處理架構

2025-02-10 09:49:00

2024-10-14 11:08:53

程序異常延遲
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日日操天天射 | 看av网 | 精品中文字幕在线 | 天天干夜夜拍 | 人人干人人玩 | 欧美成人视屏 | 国产精品综合一区二区 | 中文字幕韩在线第一页 | 亚洲一区视频在线播放 | 精品久久久久久久久久 | 日本一本在线 | 久草久 | 少妇一级淫片aaaaaaaaa | 欧美性生活网 | 黄色av免费网站 | 亚洲一区二区 | 久久免费视频2 | 91精品国产手机 | 中文字幕亚洲国产 | 天天成人综合网 | 国产亚洲高清视频 | 国产在线观看一区二区三区 | 欧美中文字幕一区二区 | 一区二区三区高清 | 亚洲精品乱码久久久久久按摩 | 婷婷久久五月天 | 国产精品免费看 | 亚洲午夜精品 | 91精品一区二区三区久久久久久 | www.操com| 午夜爽爽爽男女免费观看影院 | 亚洲第一在线 | 色眯眯视频在线观看 | 欧美一区二区三区在线观看视频 | 2019天天干夜夜操 | 亚洲 欧美 日韩 精品 | 女同av亚洲女人天堂 | 欧美日韩精品一区二区三区视频 | 国产一区二区三区四区五区加勒比 | 亚洲精品一区二区久 | 欧美在线观看一区 |