You cannot catch ConstraintViolationException.class
because it’s not propagated to that layer of your code, it’s caught by the lower layers, wrapped and rethrown under another type. So that the exception that hits your web layer is not a ConstraintViolationException
.
In my case, it’s a TransactionSystemException
.
I’m using @Transactional
annotations from Spring with the JpaTransactionManager
. The EntityManager throws a rollback exception when somethings goes wrong in the transaction, which is converted to a TransactionSystemException
by the JpaTransactionManager
.
So you could do something like this:
@ExceptionHandler({ TransactionSystemException.class })
public ResponseEntity<RestResponseErrorMessage> handleConstraintViolation(Exception ex, WebRequest request) {
Throwable cause = ((TransactionSystemException) ex).getRootCause();
if (cause instanceof ConstraintViolationException) {
Set<ConstraintViolation<?>> constraintViolations = ((ConstraintViolationException) cause).getConstraintViolations();
// do something here
}
}