[英]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
MethodArgumentNotValidException
是Exception
的子類。 這意味着它是“已檢查”的:要將它從您的verifyCard(..)
方法中拋出,您必須聲明verifyCard(..)
可以拋出它:
private void verifyCard(CardRequest card) throws MethodArgumentNotValidException {
// your code
}
如果您的項目中有lombok
依賴項,您還可以使用@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.