我使用的是Spring Boot 2.0.1,并包含了validation-starter(它随同Hibernate验证器一起提供)。Hibernate验证6.x),并试图在我的Spring仓库层中验证一个方法参数和返回对象。基本上有以下几种 ParamObj
和 ReturnObj
对于这种方法。
@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;
}
}
ParamObj
和 ReturnObj
两者都在它们的一些属性上使用了一组简单的Bean验证注解,例如 @Pattern
, @Min
等。我的问题是,在这些注释中,如果有一个是 ParamObj
或 ReturnObj
未能通过验证过程。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()
. 然而,我想知道我是否可以避免这种情况,并将这种硬编码的验证排除在仓库之外。
由于一年前我不在这里,我不会回答,但由于通过我和同学们的经验可以看出这是一个常见的问题,我想答案可能是@ControllerAdvice,方便任何类型的异常doc --> https:/docs.spring.iospring-frameworkdocscurrentjavadoc-apiorgspringframeworkwebbindannotationControllerAdvice.html