天天看點

springboot接口簽名統一效驗_Spring Boot 優雅地實作接口參數校驗1. pom.xml2. dto3. controller4. 去掉BindingResult參數5. 統一傳回格式6. 去掉接口中的Response包裝7. 每個校驗錯誤都對應不同的錯誤碼8. 個别接口不統一包裝響應

今天繼續為大家分享在工作中如何優雅的校驗接口的參數的合法性以及如何統一處理接口傳回的json格式。每個字都是幹貨,原創不易,分享不易。

springboot接口簽名統一效驗_Spring Boot 優雅地實作接口參數校驗1. pom.xml2. dto3. controller4. 去掉BindingResult參數5. 統一傳回格式6. 去掉接口中的Response包裝7. 每個校驗錯誤都對應不同的錯誤碼8. 個别接口不統一包裝響應

validation主要是校驗使用者送出的資料的合法性,比如是否為空,密碼是否符合規則,郵箱格式是否正确等等,校驗架構比較多,用的比較多的是hibernate-validator, 也支援國際化,也可以自定義校驗類型的注解,這裡隻是簡單地示範校驗架構在Spring Boot中的簡單內建,要想了解更多可以參考 hibernate-validator。

1. pom.xml

<dependency>
           

2. dto

public 
           

3. controller

import org.springframework.validation.BindingResult;
           
springboot接口簽名統一效驗_Spring Boot 優雅地實作接口參數校驗1. pom.xml2. dto3. controller4. 去掉BindingResult參數5. 統一傳回格式6. 去掉接口中的Response包裝7. 每個校驗錯誤都對應不同的錯誤碼8. 個别接口不統一包裝響應

4. 去掉BindingResult參數

每個接口都需要BindingResult參數,而且每個接口都需要處理錯誤資訊,這樣增加一個參數也不優雅,處理錯誤資訊代碼量也很重複。如果去掉BindingResult參數,系統就會報錯MethodArgumentNotValidException,我們隻需要使用全局異常來捕獲該錯誤,處理一下就可以省略傳BindingResult參數了。

@RestController
           

@RestControllerAdvice 用于攔截所有的@RestController

@RestControllerAdvice
           
springboot接口簽名統一效驗_Spring Boot 優雅地實作接口參數校驗1. pom.xml2. dto3. controller4. 去掉BindingResult參數5. 統一傳回格式6. 去掉接口中的Response包裝7. 每個校驗錯誤都對應不同的錯誤碼8. 個别接口不統一包裝響應

5. 統一傳回格式

錯誤碼枚舉

@Getter
           

自定義異常。

@Getter
           

定義傳回格式。

@Getter
           

全局異常處理器增加對APIException的攔截,并修改異常時傳回的資料格式。

@RestControllerAdvice
           

SimpleController 增加一個抛出異常的方法。

@RestController
           
springboot接口簽名統一效驗_Spring Boot 優雅地實作接口參數校驗1. pom.xml2. dto3. controller4. 去掉BindingResult參數5. 統一傳回格式6. 去掉接口中的Response包裝7. 每個校驗錯誤都對應不同的錯誤碼8. 個别接口不統一包裝響應

報錯傳回的格式。

springboot接口簽名統一效驗_Spring Boot 優雅地實作接口參數校驗1. pom.xml2. dto3. controller4. 去掉BindingResult參數5. 統一傳回格式6. 去掉接口中的Response包裝7. 每個校驗錯誤都對應不同的錯誤碼8. 個别接口不統一包裝響應

不報錯,傳回的格式。

springboot接口簽名統一效驗_Spring Boot 優雅地實作接口參數校驗1. pom.xml2. dto3. controller4. 去掉BindingResult參數5. 統一傳回格式6. 去掉接口中的Response包裝7. 每個校驗錯誤都對應不同的錯誤碼8. 個别接口不統一包裝響應

6. 去掉接口中的Response包裝

@RestControllerAdvice既可以全局攔截異常也可攔截指定包下正常的傳回值,可以對傳回值進行修改。

@RestController
           
springboot接口簽名統一效驗_Spring Boot 優雅地實作接口參數校驗1. pom.xml2. dto3. controller4. 去掉BindingResult參數5. 統一傳回格式6. 去掉接口中的Response包裝7. 每個校驗錯誤都對應不同的錯誤碼8. 個别接口不統一包裝響應

7. 每個校驗錯誤都對應不同的錯誤碼

@Retention(RetentionPolicy.RUNTIME)
           
@Data
           

校驗異常擷取注解中的錯誤碼。

@ExceptionHandler(MethodArgumentNotValidException.class)
           
springboot接口簽名統一效驗_Spring Boot 優雅地實作接口參數校驗1. pom.xml2. dto3. controller4. 去掉BindingResult參數5. 統一傳回格式6. 去掉接口中的Response包裝7. 每個校驗錯誤都對應不同的錯誤碼8. 個别接口不統一包裝響應
springboot接口簽名統一效驗_Spring Boot 優雅地實作接口參數校驗1. pom.xml2. dto3. controller4. 去掉BindingResult參數5. 統一傳回格式6. 去掉接口中的Response包裝7. 每個校驗錯誤都對應不同的錯誤碼8. 個别接口不統一包裝響應

8. 個别接口不統一包裝響應

有時候第三方接口回調我們的接口,我們的接口必須按照第三方定義的傳回格式來,此時第三方不一定和我們自己的傳回格式一樣,是以要提供一種可以繞過統一包裝的方式。

@Retention(RetentionPolicy.RUNTIME)
           
@RestController
           

ResponseControllerAdvice 增加一個不包裝的條件,配置了@NotResponseWrap注解就跳過包裝。

@Override
           
springboot接口簽名統一效驗_Spring Boot 優雅地實作接口參數校驗1. pom.xml2. dto3. controller4. 去掉BindingResult參數5. 統一傳回格式6. 去掉接口中的Response包裝7. 每個校驗錯誤都對應不同的錯誤碼8. 個别接口不統一包裝響應