当我在javax.validations中使用@valid批注验证bean时,对于某些对象,我得到了ConstraintViolationException,对于某些对象,我得到了MethodArgumentNotValidException。
我知道,如果我在controller处的@ResponseBody中验证任何内容,它将抛出MethodArgumentNotValidException。
但是对于某些在类级别的自定义验证(例如,@ MyCustomValidation),即使正在@ResponseValidation中进行验证,它也会引发ConstraintViolationException。
对于其他针对不同REST端点的自定义验证,它会抛出MethodArgumentNotValidException。
我发现很难理解它的行为。
@PostMapping(path = "/someEndPoint")
@Validated(OnASave.class)
public ResponseEntity<ClassA> saveObjA(@Valid @RequestBody ClassA objA)
@PostMapping(path = "/someOtherEndPoint")
@Validated(OnBSave.class)
public ResponseEntity<ClassB> saveObjB(@Valid @RequestBody ClassB objB)
ClassA和ClassB都具有自定义验证。
最佳答案
当您使用@Valid时,您将应用在模型类字段上定义的验证,尽管有不同类型的验证,但您可以选择@ NotNull,@ Max,@ Min等,您将获得匹配类型。
通常,所有这些都与在所有情况下都将抛出的 MethodArgumentNotValidException 平行。
从官方文件
当违反某些约束时, hibernate 实体管理器将抛出ConstraintViolationException,因此这意味着您违反了正在使用的某些实体中的某些字段。