如何正确抛出 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
MethodArgumentNotValidException
是 Exception
的子类。这意味着它是 "checked": 要将它从你的 verifyCard(..)
方法中抛出,你必须声明 verifyCard(..)
可以抛出它:
private void verifyCard(CardRequest card) throws MethodArgumentNotValidException {
// your code
}
如果您的项目中有 lombok
依赖项,您也可以使用 @SneakyThrows
注释伪造编译器。
throw new MethodArgumentNotValidException(null, result);
以上构造函数将不起作用,因为方法参数是必需的。
有效构造函数 (reference) 是:
MethodArgumentNotValidException(MethodParameter parameter, BindingResult bindingResult);
因此,在您的情况下:
throw new MethodArgumentNotValidException(new MethodParameter(
this.getClass().getDeclaredMethod("verifyCard", YourClassName.class), 0), errors);
我试图获得与在控制器的对象参数中使用@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
的子类。这意味着它是 "checked": 要将它从你的 verifyCard(..)
方法中抛出,你必须声明 verifyCard(..)
可以抛出它:
private void verifyCard(CardRequest card) throws MethodArgumentNotValidException {
// your code
}
如果您的项目中有 lombok
依赖项,您也可以使用 @SneakyThrows
注释伪造编译器。
throw new MethodArgumentNotValidException(null, result);
以上构造函数将不起作用,因为方法参数是必需的。 有效构造函数 (reference) 是:
MethodArgumentNotValidException(MethodParameter parameter, BindingResult bindingResult);
因此,在您的情况下:
throw new MethodArgumentNotValidException(new MethodParameter(
this.getClass().getDeclaredMethod("verifyCard", YourClassName.class), 0), errors);