簡體   English   中英

使用不同的 http 代碼 Spring 引導捕獲多個異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM