如何在Spring Boot中使用Hibernate验证器的Bean验证失败时抛出自定义异常?

问题描述 投票:2回答:1

我使用的是Spring Boot 2.0.1,并包含了validation-starter(它随同Hibernate验证器一起提供)。Hibernate验证6.x),并试图在我的Spring仓库层中验证一个方法参数和返回对象。基本上有以下几种 ParamObjReturnObj 对于这种方法。

@Repository
@Validated // Spring integration of validation
public class MyRepoImpl implements MyRepo {

  @Override
  @Valid
  public ReturnObj myMethod(@Valid ParamObj param) throw CustomException {
    try {
       // makes a call that might throw an exception
    } catch (Exception e) {
      throw new CustomException(/*...*/, e);
    }

    return returnObj;
  }
}

ParamObjReturnObj 两者都在它们的一些属性上使用了一组简单的Bean验证注解,例如 @Pattern, @Min等。我的问题是,在这些注释中,如果有一个是 ParamObjReturnObj 未能通过验证过程。MyRepoImpl#myMethod() 会扔 javax.validation.ConstraintViolationException.

然而,正如你所看到的,合同中的... myMethod() 责令扔 CustomException. 是的。ConstraintViolationException 是一个 RuntimeException然而,现在的呼叫者 MyRepoImpl#myMethod(),例如服务层逻辑,需要抓住这个 RuntimeException 除了 CustomException.

原因是,我需要 阻止 百废待兴 出服务层 (对于这个特殊的春天 @Service I have which calls this repository)--这个服务是一长串服务列表的一部分,这些服务通过服务编排被调用,而服务编排构建了一个更大的包含对象。换句话说,这一块(结果来通过 MyRepoImpl)被认为是 可选,随后,其故障只应被记录,但不应该被记录。不厌其烦.

因此,我不能利用 ControllerAdvice 捕捉 ConstraintViolationException 对于整个应用程序来说,我的目标是,当方法参数或返回的验证失败时,只抛出一个方法。

我的目标是,当方法参数或返回的验证失败时,能够只抛出 CustomException 返回给调用者。

只用注释就能实现吗?我研究了 MethodValidationPostProcessor 但不知道能不能实现自己的这个目标。

P.S.我能想到的唯一的方法就是放弃使用 @Valid@Validated 并称 Validator#validate(obj, ...) 内的参数和返回值进行编程。try-catch 块,捕获约束异常,然后抛出我的 CustomException(). 然而,我想知道我是否可以避免这种情况,并将这种硬编码的验证排除在仓库之外。

java spring spring-boot bean-validation hibernate-validator
1个回答
0
投票

由于一年前我不在这里,我不会回答,但由于通过我和同学们的经验可以看出这是一个常见的问题,我想答案可能是@ControllerAdvice,方便任何类型的异常doc --> https:/docs.spring.iospring-frameworkdocscurrentjavadoc-apiorgspringframeworkwebbindannotationControllerAdvice.html

© www.soinside.com 2019 - 2024. All rights reserved.