When I am validating bean using @Valid annotation in javax.validation, for some objects I am getting ConstraintViolationException and for some I am getting a MethodArgumentNotValidException.
I understand that, if I validate anything in @ResponseBody in the controller , it throws a MethodArgumentNotValidException.
But for some custom validations(eg. @MyCustomValidation) at the class level it is throwing ConstraintViolationException even if it is being validated in @ResponseValidation.
And for some other custom validation for a different REST endpoint, it throws MethodArgumentNotValidException.
I am finding it a bit difficult to understand its behavior.
@PostMapping(path = "/someEndPoint")
@Validated(OnASave.class)
public ResponseEntity<ClassA> saveObjA(@Valid @RequestBody ClassA objA)
Result - throws
MethodArgumentNotValidException
@PostMapping(path = "/someOtherEndPoint")
@Validated(OnBSave.class)
public ResponseEntity<ClassB> saveObjB(@Valid @RequestBody ClassB objB)
Result - throws
ConstraintViolationException
Both ClassA and ClassB has custom validations.
When you use @Valid, you are applying validation which is defined by you on your model class fields, while there are different types of validations, you can choose like @NotNull, @Max, @Min and so on, you will get the matching type.
In general, all of these are parallel to MethodArgumentNotValidException which will be thrown in all cases.
From official document
ConstraintViolationException is thrown by hibernate entity manager when some constrain violated, so this means you violated some fields in some entity you are using.