我對請求正文中的數量屬性進行了自定義驗證,如果驗證失敗,它會拋出我的 BadRequestException(從我的 BaseException 擴展),在 ExceptionTranslator 類(標有@ControllerAdvice)中,我有兩種捕獲例外的方法,一種用于 BaseException,另一種用于RuntimeException 我的問題是,當驗證失敗時,我希望呼叫 handleBaseException,但在 isValid 呼叫期間使用訊息 Unexpected 例外呼叫了 handleRuntimeException。
@Override
public boolean isValid(Long value, ConstraintValidatorContext context) {
if (value < appConfig.getMinAmount()) {
throw new BadRequestException()
.addErrorDetail(null, I18nKey.EXCEPTION.AMOUNT_SIZE, appConfig.getMinAmount());
}
return true;
}
public class BadRequestException extends BaseException {
public BadRequestException() {
super(HttpStatus.BAD_REQUEST);
}
}
@ControllerAdvice
public class ExceptionTranslator {
@ExceptionHandler(value = {BaseException.class})
public ResponseEntity<Object> handleBaseException(BaseException ex) {
//Some work
}
@ExceptionHandler(value = {RuntimeException.class})
protected ResponseEntity<Object> handleRuntimeException(RuntimeException ex) {
//Some work
}
}
uj5u.com熱心網友回復:
在許多情況下,您可以正確應用自定義驗證:
在處理 DTO 驗證時,您必須用@Validated.
在自定義驗證器上,MethodArgumentNotValidException如果違反某些約束(對某些欄位進行驗證)或ConstraintViolationException您的案例出現例外,則拋出的例外將是拋出的例外,而不是BaseException。
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ErrorResponse> onConstraintValidationException(
final MethodArgumentNotValidException exception, HttpServletRequest request) {...}
因此,BaseException將在控制器捕獲的ConstraintViolationException中:
@ExceptionHandler(value = {RuntimeException.class})
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/514344.html
標籤:春天弹簧靴例外
