如何正确抛出MethodArgumentNotValidException

时间:2018-03-17 16:47:54

标签: java spring spring-boot bean-validation

我试图获得与在Controller中的对象参数中使用@Valid时相同的结果。当对象无效时,异常(MethodArgumentNotValidException)由具有@RestControllerAdvice的ExceptionHandlerController抛出。

在我的情况下,我想验证一个对象,但我只能在服务层验证它。该对象具有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块。当我删除它时,我得到编译错误。如何解决?

3 个答案:

答案 0 :(得分:1)

您已经通过catch块处理了它,您应该删除try-catch到全局处理程序中捕获它。

然后指定如下方法

private void verifyCard(CardRequest card) throws MethodArgumentNotValidException

答案 1 :(得分:1)

MethodArgumentNotValidExceptionException的子类。这意味着它已“检查”:要将其从verifyCard(..)方法中删除,您必须声明verifyCard(..)可以抛出它:

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

答案 2 :(得分:0)

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

https://projectlombok.org/features/SneakyThrows