Исключения валидатора гибернации - PullRequest
1 голос
/ 12 ноября 2009

Я использую Hibernate Validator в приложении с EJB и Spring MVC. Я использую JBoss 5, Hibernate 3 и Spring MVC версии 3.

Я хотел бы попытаться отловить исключения проверки на уровне Spring Exception Resolver и сгенерировать сообщение об ошибке на основе сообщения InvalidStateException. Я не хочу помещать логику обработки исключений в слой доступа к данным; Я хочу, чтобы это управлялось аннотациями и просто обрабатывало ошибки валидации в одном централизованном месте.

Модель домена проверяется правильно, и исключение типа InvalidStateException генерируется, как и ожидалось, когда я пытаюсь создать недопустимую сущность (например, нарушить ограничение длины для поля). Когда я попытался поймать исключение в моем экземпляре средства разрешения исключений Spring, я обнаружил, что мое первоначальное исключение исчезло, и его место заняла javax.ejb.EJBTransactionRolledbackException. Исходное исключение отсутствует в списке, вызванном списком.

Моим первым предположением было то, что org.hibernate.validator.InvalidStateException не было аннотировано ApplicationException, поэтому я установил прослушиватель событий Hibernate, перехватил исходное исключение и перебросил его как новое исключение, аннотированное ApplicationException. Это не имеет никакого эффекта.

Еще одна сложность заключается в том, что веб-уровень вызывает EJB через удаленный интерфейс. Я пометил свой класс исключений WebFault, но безрезультатно.

Что я должен сделать, чтобы исключение всплыло полностью?

1 Ответ

2 голосов
/ 12 ноября 2009

Попробуйте это?

</p> <p>protected InvalidStateException extractValidationException(Throwable ex) { Throwable e = ex; while (e != null) { if (e instanceof InvalidStateException) { return (ValidationException) e; } else if (e instanceof EJBException) { e = ((EJBException) e).getCausedByException(); } else { e = e.getCause(); } } return null; }

...