Исключения валидатора гибернации
-
19-09-2019 - |
Вопрос
Я использую Hibernate Validator в приложении с EJB и Spring MVC.Я использую JBoss 5, Hibernate 3 и Spring MVC версии 3.
Я хотел бы попытаться перехватить исключения проверки на уровне Spring Exception Resolver и сгенерировать сообщение об ошибке на основе InvalidStateException
Сообщение.Я не хочу помещать логику обработки исключений на уровень доступа к данным;Я хочу, чтобы это управлялось аннотациями и просто обрабатывало ошибки проверки в одном централизованном месте.
Модель предметной области проверяется корректно, и возникает исключение типа InvalidStateException
выдается, как и ожидалось, когда я пытаюсь создать недопустимый объект (напримернарушает ограничение длины поля).В момент попытки перехватить исключение в моем экземпляре Spring Exception resolver, я обнаруживаю, что мое исходное исключение исчезло, и javax.ejb.EJBTransactionRolledbackException
занял свое место.Исходное исключение отсутствует в списке "вызвано".
Моим первым предположением было то, что org.hibernate.validator.InvalidStateException
не было снабжено комментарием ApplicationException
, поэтому я установил прослушиватель событий Hibernate, перехватил исходное исключение и перезаписал его как новое исключение, помеченное ApplicationException
.Это не имеет никакого эффекта.
Еще одна сложность заключается в том, что веб-уровень вызывает EJBS через удаленный интерфейс.Я прокомментировал свой класс исключений следующим образом WebFault
, но безрезультатно.
Что я должен сделать, чтобы убедиться, что исключение всплывает до конца?
Решение
Попробовать это?
защищенное исключение InvalidStateException extractValidationException(бросаемый ex) {
Бросаемый e = ex;while (e != null) {
if (e исключение экземпляра InvalidStateException) {
возврат (исключение проверки) e;} else if (e instanceof EJBException) {
e = ((EJBException) e).getCausedByException();} else {
e = e.getCause();}
}
возвращает значение null;}