簡體   English   中英

如何正確拋出 MethodArgumentNotValidException

[英]How to properly throw MethodArgumentNotValidException

我試圖獲得與在控制器的對象參數中使用 @Valid 時相同的結果。 當對象無效時,我的 ExceptionHandlerController 會拋出一個異常 (MethodArgumentNotValidException),它有 @RestControllerAdvice。

在我的例子中,我想驗證一個對象,但我只能在服務層驗證它。 該對象具有 bean 驗證注釋,因此我試圖以編程方式為我的 ExceptionHandlerController 處理它拋出 MethodArgumentNotValidException,但我沒有成功。

到目前為止我有這個:

private void verifyCard(CardRequest card) {
    BeanPropertyBindingResult result = new BeanPropertyBindingResult(card, "card");
    SpringValidatorAdapter adapter = new SpringValidatorAdapter(this.validator);
    adapter.validate(card, result);

    if (result.hasErrors()) {
        try {
            throw new MethodArgumentNotValidException(null, result);
        } catch (MethodArgumentNotValidException e) {
            e.printStackTrace();
        }
    }
}

第一個參數來自 MethodParameter 類型,我無法創建此對象。 這是處理我的問題的最佳方法嗎?

編輯 1:

我無法刪除 try/catch 塊。 當我刪除它時,出現編譯錯誤。 如何解決?

你已經通過catch塊處理了它,你應該刪除try-catch到你的全局處理程序中捕獲它。

然后指定如下方法

private void verifyCard(CardRequest card) throws MethodArgumentNotValidException

MethodArgumentNotValidExceptionException的子類。 這意味着它是“已檢查”的:要將它從您的verifyCard(..)方法中拋出,您必須聲明verifyCard(..)可以拋出它:

private void verifyCard(CardRequest card) throws MethodArgumentNotValidException {
// your code
}

如果您的項目中有lombok依賴項,您還可以使用@SneakyThrows注釋偽造編譯器。

https://projectlombok.org/features/SneakyThrows

throw new MethodArgumentNotValidException(null, result);

上面的構造函數將不起作用,因為方法參數是必需的。 有效的構造函數( 參考)是:

MethodArgumentNotValidException(MethodParameter parameter, BindingResult bindingResult);

因此,在您的情況下:

throw new MethodArgumentNotValidException(new MethodParameter(
this.getClass().getDeclaredMethod("verifyCard", YourClassName.class), 0), errors);

暫無
暫無

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

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