簡體   English   中英

用於在 Spring Boot 中進行驗證的自定義 ExceptionHandler?

[英]Custom ExceptionHandler for validation in Spring Boot?

在一個 Spring Boot 應用程序中,我在我的 Spring Boot 應用程序中實現了一個自定義異常處理,如例所示,並拋出NoSuchElementFoundException沒有任何問題,如下所示:

public EmployeeDto findByEmail(String email) {
    return employeeRepository.findByEmail(email)
            .map(EmployeeDto::new)
            .orElseThrow(() -> new NoSuchElementFoundException(NO_ITEM_FOUND));
}

但是,我還添加了另一個自定義異常類,並在我的 Global 類中定義了它的處理程序,如下所示:

@ExceptionHandler(NotValidFormatException.class)
@ResponseStatus(HttpStatus.UNPROCESSABLE_ENTITY)
public ResponseEntity<Object> handleNotValidFormatException(NotValidFormatException ex, WebRequest request) {
    log.error("Invalid format. Only csv files are allowed.", ex);
    return buildErrorResponse(ex, HttpStatus.UNPROCESSABLE_ENTITY, request);
}

這是我的服務方法,如果文件不是有效類型,我將在其中拋出此異常:

public void create(MultipartFile file) throws Exception {
    if (CsvHelper.hasCsvFormat(file)) {
        throw new NotValidFormatException("Not valid type");
    }
    // ...
}

現在,我不確定應該在哪里檢查有效性:

我應該通過我的 Util 類中的靜態方法來檢查它嗎?

或實施此處提到的自定義驗證器? 在這種情況下,我不確定是否還需要自定義異常類。 任何想法?

創建驗證器幾乎總是一個好主意,因為對這個服務方法進行單元測試更簡單。

public void create(MultipartFile file) throws Exception {
    fileValidator.validate(file);
}
  1. FileValidator創建單元測試
  2. 模擬fileValidator.validate(eq(file))方法以拋出NotValidFormatException並在調用create(file)時斷言您有異常。
  3. 對於服務的其他測試方法,不使用fileValidator執行任何操作。

請記住,有時最好不要使用驗證器來簡化代碼。 例如,如果您需要驗證id

筆記

我不想為每個驗證檢查創建異常。 只是為了對所有驗證錯誤使用一個通用類。 您可以使用這種方法返回多個驗證錯誤。

public class ValidationException extends ServiceException {

    public ValidationException(ErrorResponseItem item) {
        this(Collections.singletonList(item));
    }

    public ValidationException(List<ErrorResponseItem> items) {
        super(HttpStatus.UNPROCESSABLE_ENTITY, items);
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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