如何正确抛出 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 的子类。这意味着它是 "checked": 要将它从你的 verifyCard(..) 方法中抛出,你必须声明 verifyCard(..) 可以抛出它:

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

如果您的项目中有 lombok 依赖项,您也可以使用 @SneakyThrows 注释伪造编译器。

https://projectlombok.org/features/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);