[英]Catch Multiple exceptions with different http codes Spring Boot
我需要在我的應用程序的 Controller 中獲得類似的東西,在創建用戶方法中,該方法具有不同的密碼驗證,另一個用於 email,名稱等。 我已經通過解析 BindingResult getDefaultMessage 完成了“細節”部分,但我需要檢查異常類型以將其解析為相應的 http 代碼,我該怎么做?
{
"mistakes": [
{
"status": "403",
"detail": "Password should have 16 characters."
},
{
"status": "422",
"detail": "Invalid Email Format."
},
{
"status": "500",
"detail": "Name cannot be empty."
}
]
}
您無法捕獲多個異常,但您可以使用 Spring 的@ExceptionHandler
為不同的異常編寫通用處理邏輯。
您想用一些JSON從您的Z594C103F2C6E04C3D8B059F031E0C1AZ(不帶有視圖),我假設您是您開發Z50780F47F47F47F47F47F47F47F47D47D47D47D47DBC1BC1AZ(not)
然后,首先,您應該考慮在驗證用戶輸入時在您的場景中返回400(錯誤請求)狀態代碼,這是向客戶端顯示來自他的數據不符合您的 API 規則的最佳方式(違反API 規格)。 所以我認為在你提到的所有這些情況下,用 400 回應是明智的。
如果您將 javax.validation 用於您的 controller 的方法 arguments, BindException.class
會為您完成所有的魔法,將所有驗證錯誤累積在一個地方。 所以基本上你可以捕獲這個異常並將其轉換為一些自定義錯誤 DTO。
例如,像這樣:
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BindException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ErrorDTO handleValidationError(BindException ex) {
return new ErrorDTO(bindErrorsToList(ex));
}
private List<ErrorDetail > bindErrorsToList(BindException ex) {
List<ErrorDetail> validationErrorDetails = new LinkedHashMap<>();
if (ex.hasFieldErrors()) {
ex.getFieldErrors().stream()
.map(this::fieldErrorToDetails)
.collect(Collectors.toList()));
}
return validationErrorDetails;
}
private ErrorDetail fieldErrorToDetails(FieldError error) {
return new ErrorDetail(error.getField(), error.getRejectedValue(), error.getDefaultMessage());
}
}
public class ErrorDTO {
private List<ErrorDetail> mistakes;
// constructors, getters, setters...
}
public class ErrorDetail {
private String field;
private String rejectedValue;
private String detail;
// constructors, getters, setters...
}
在傳遞給您的 controller 的 DTO 驗證失敗后,此代碼將返回如下內容(以及 400 狀態代碼):
{
"mistakes": [
{
"field": "password",
"rejected_value": "some_pass",
"detail": "Password should have 16 characters."
},
{
"field": "email",
"rejected_value": "test@g",
"detail": "Invalid Email Format."
}
]
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.