NuC*_*dle 6 java spring hibernate-validator bean-validation spring-boot
我正在使用 Spring Boot 2.0.1,其中包含验证启动程序(随Hibernate Validation 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;
}
}
Run Code Online (Sandbox Code Playgroud)
ParamObj并且ReturnObj两者都在其某些属性上使用一组简单的 Bean Validation 注释,例如@Pattern、@Min等。我的问题是,使用这些注释,如果验证过程中的任何一个ParamObj或失败,都会抛出。ReturnObjMyRepoImpl#myMethod()javax.validation.ConstraintViolationException
然而,正如您所看到的,合同强制myMethod()要求抛出CustomException. 是的,ConstraintViolationException是 a RuntimeException,但是,现在 的调用者(例如服务层逻辑)除了 之外还MyRepoImpl#myMethod()需要捕获它。RuntimeExceptionCustomException
原因是,我需要防止所有异常从服务层冒出(对于这个特定的 Spring,@Service我调用了这个存储库)——该服务是通过服务编排调用的一长串服务的一部分它构造了一个更大的包围对象。换句话说,这一部分(通过获得的结果MyRepoImpl)被认为是可选的,随后,它的失败应该只被记录,而不是停止整个过程。
因此,我无法利用ControllerAdvice捕获来捕获ConstraintViolationException整个应用程序。
我的目标是,当方法参数或返回验证失败时,能够仅将其返回CustomException给调用者。
仅通过注释可以实现这一点吗?我研究过,MethodValidationPostProcessor但不知道我是否可以实现自己的目标来实现这一目标。
PS 我认为实现此目的的唯一方法是放弃@Valid/@Validated并Validator#validate(obj, ...)以编程方式调用块内的参数和返回值try-catch,捕获约束异常,然后抛出我的CustomException(). 但是,我想知道是否可以避免这种情况并将此硬编码验证保留在存储库之外。
小智 0
因为我一年前不在这里,所以我不会回答,但由于这是一个常见问题,因为我可以通过我与同学的经验看到,我认为答案可能是@ControllerAdvice,对于任何类型的异常文档都很方便 - > https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/ControllerAdvice.html
| 归档时间: |
|
| 查看次数: |
4405 次 |
| 最近记录: |