国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

SpringBoot 實戰 (十四) | 統一處理異常

arashicage / 3284人閱讀

摘要:前言如題,今天介紹是如何統一處理全局異常的。主要是用于異常攔截出獲取并將設置到消息類中返回。狀態碼異常攔截類通過加入來聲明該類可攔截請求,同時在方法加入并在該注解中指定要攔截的異常類。測試訪問測試正常返回數據結果。

微信公眾號:一個優秀的廢人
如有問題或建議,請后臺留言,我會盡力解決你的問題。
前言

如題,今天介紹 SpringBoot 是如何統一處理全局異常的。SpringBoot 中的全局異常處理主要起作用的兩個注解是 @ControllerAdvice@ExceptionHandler ,其中 @ControllerAdvice 是組件注解,添加了這個注解的類能夠攔截 Controller 的請求,而 ExceptionHandler 注解可以設置全局處理控制里的異常類型來攔截要處理的異常。 比如:@ExceptionHandler(value = NullPointException.class) 。

準備工作

SpringBoot 2.1.3

IDEA

JDK 8

依賴配置

        
        
            org.springframework.boot
            spring-boot-starter-data-jpa
        
        
        
            org.springframework.boot
            spring-boot-starter-web
        

        
        
            mysql
            mysql-connector-java
            runtime
        
        
        
            org.projectlombok
            lombok
            true
        
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    
配置文件
spring:
  # 數據庫相關
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=true
    username: root
    password: 123456

  jpa:
    hibernate:
      ddl-auto: update   #ddl-auto:設為 create 表示每次都重新建表
    show-sql: true
返回的消息類
public class Message implements Serializable {

    /**
     * 狀態碼
     */
    private Integer code;

    /**
     * 返回信息
     */
    private String message;

    /**
     * 返回的數據類
     */
    private T data;

    /**
     * 時間
     */
    private Long time;

    // getter、setter 以及 構造方法略。。。
}
工具類

用于處理返回的數據以及信息類,代碼注釋很詳細不說了。

public class MessageUtil {

    /**
     * 成功并返回數據實體類
     * @param o
     * @param 
     * @return
     */
    public static Message ok(E o){
        return new Message<>(200, "success", o, new Date().getTime());
    }

    /**
     * 成功,但無數據實體類返回
     * @return
     */
    public static Message ok(){
        return new Message<>(200, "success", null, new Date().getTime());
    }

    /**
     * 失敗,有自定義異常返回
     * @param code
     * @param msg
     * @return
     */
    public static Message error(Integer code,String msg){
        return new Message<>(code, msg, null, new Date().getTime());
    }
}
自定義異常

通過繼承 RuntimeException ,聲明 code 用于定義不同類型的自定義異常。主要是用于異常攔截出獲取 code 并將 code 設置到消息類中返回。

public class CustomException extends RuntimeException{

    /**
     * 狀態碼
     */
    private Integer code;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public CustomException(Integer code, String message){

        super(message);
        this.code = code;

    }
}
異常攔截類

通過加入 @RestControllerAdvice 來聲明該類可攔截 Controller 請求,同時在 handle方法加入 @ExceptionHandler 并在該注解中指定要攔截的異常類。

@RestControllerAdvice // 控制器增強處理(返回 JSON 格式數據),添加了這個注解的類能被 classpath 掃描自動發現
public class ExceptionHandle {

    @ExceptionHandler(value = Exception.class) // 捕獲 Controller 中拋出的指定類型的異常,也可以指定其他異常
    public Message handler(Exception exception){

        if (exception instanceof CustomException){
            CustomException customException = (CustomException) exception;
            return MessageUtil.error(customException.getCode(), customException.getMessage());
        } else {
            return MessageUtil.error(120, "異常信息:" + exception.getMessage());
        }
    }
}

這里只對自定義異常以及未知異常進行處理,如果你在某方法中明確知道可能會拋出某個異常,可以加多一個特定的處理。比如說你明確知道該方法可能拋出 NullPointException 可以追加 NullPointException 的處理:

if (exception instanceof CustomException){
     CustomException customException = (CustomException) exception;
     return MessageUtil.error(customException.getCode(), customException.getMessage());
} else if (exception instanceof NullPointException ){
     return MessageUtil.error(500, "空指針異常信!");
} else {
     return MessageUtil.error(120, "異常信息:" + exception.getMessage());
}
controller 層
@RestController
@RequestMapping("/student")
public class StudentController {

    @Autowired
    private StudentService studentService;

    @GetMapping("/{id}")
    public Message findStudentById(@PathVariable("id") Integer id){

        if (id < 0){
            //測試自定義錯誤
            throw new CustomException(110, "參數不能是負數!");

        } else if (id == 0){
            //硬編碼,為了測試
            Integer i = 1/id;
            return null;
        } else {
            Student student = studentService.findStudentById(id);
            return MessageUtil.ok(student);
        }
    }
}
完整代碼

https://github.com/turoDog/De...

如果覺得對你有幫助,請給個 Star 再走唄,非常感謝。

Postman 測試

訪問 http://localhost:8080/student/5 測試正常返回數據結果。

訪問 http://localhost:8080/student/0 測試未知異常的結果。

訪問 http://localhost:8080/student/-11 測試自定義異常的結果。

后語

如果本文對你哪怕有一丁點幫助,請幫忙點好看。你的好看是我堅持寫作的動力。

另外,關注之后在發送 1024 可領取免費學習資料。資料內容詳情請看這篇舊文:Python、C++、Java、Linux、Go、前端、算法資料分享

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73505.html

相關文章

  • Spring Boot 2.x 系列教程:WebFlux REST API 全局異常處理 Error

    摘要:挺多人咨詢的,異常處理用切面注解去實現去全局異常處理。全局異常處理類,代碼如下代碼解析如下抽象類是用來處理全局錯誤時進行擴展和實現注解標記的切面排序,值越小擁有越高的優先級,這里設置優先級偏高。 本文內容 為什么要全局異常處理? WebFlux REST 全局異常處理實戰 小結 摘錄:只有不斷培養好習慣,同時不斷打破壞習慣,我們的行為舉止才能夠自始至終都是正確的。 一、為什么要全局...

    BicycleWarrior 評論0 收藏0
  • SpringBoot 實戰 (十) | 聲明式事務

    摘要:前言如題,今天介紹的聲明式事務。提供一個注解在配置類上來開啟聲明式事務的支持。而在配置里還開啟了對聲明式事務的支持,代碼如下所以在中,無須顯式開啟使用注解。源碼下載后語以上為聲明式事務的教程。 微信公眾號:一個優秀的廢人如有問題或建議,請后臺留言,我會盡力解決你的問題。 前言 如題,今天介紹 SpringBoot 的 聲明式事務。 Spring 的事務機制 所有的數據訪問技術都有事務處...

    ygyooo 評論0 收藏0
  • SpringBoot 實戰 (十五) | 服務端參數校驗之一

    摘要:前言估計很多朋友都認為參數校驗是客戶端的職責,不關服務端的事。輕則導致服務器宕機,重則泄露數據。所以,這時就需要設置第二道關卡,服務端驗證了。老項目的服務端校驗不能為空不能為空看以上代碼,就一個的校驗就如此麻煩。 前言 估計很多朋友都認為參數校驗是客戶端的職責,不關服務端的事。其實這是錯誤的,學過 Web 安全的都知道,客戶端的驗證只是第一道關卡。它的參數驗證并不是安全的,一旦被有心人...

    QiShare 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<