Правильная обработка исключений EJB - ClassNotFoundException от клиента
Вопрос
У меня есть несколько EJB, которые используют Hibernate для сохранения данных в базе данных. У меня есть толстый клиент Swing, который общается с этими EJB. Клиент ничего не знает о базе данных (без файла драйвера). Р>
Во время одной транзакции может быть сгенерировано исключение Hibernate ConstraintViolationException. Я перехватываю все исключения и помещаю их в EJBException примерно так:
catch(HibernateException e) {
e.printStackTrace();
throw new EJBException(e);
}
Проблема, которую я получаю, состоит в том, что, когда исключение не вызывается JBoss Invoker на стороне клиента, генерируется исключение ClassNotFoundException (для PSQLException), поскольку у клиента нет jar драйвера sql в пути к классам. Р>
Я изменил это приложение, чтобы всегда передавать пойманную исключительную ситуацию в конструктор ejbexception, чтобы мы могли иметь историю трассировки стека. Теперь я понимаю, почему разработчики оригинала этого не сделали. Р>
На данный момент я вижу два варианта - либо включить jar драйвера postgres с клиентом, либо удалить передачу перехваченного исключения в конструктор EJBException. Мне интересно, есть ли у кого-нибудь другие предложения, а также как другие обрабатывают исключения в своих EJB-компонентах?
Решение
Я считаю, что клиенту, конечному пользователю, не нужно знать технические детали проблемы. Следовательно, на различных границах слоя вполне разумно преобразовать техническое исключение в общую ошибку "Произошла ошибка XYZ".
Схема, которую я видел, использовалась для сервера, чтобы выделить уникальный номер ошибки в точке, где обнаружено исключение. Затем он записывает диагностику в свои журналы, включая этот номер. Сообщения, сообщаемые клиенту, просто включают номер. Служба поддержки может сопоставить отчет пользователя о проблеме по этому конкретному номеру ошибки.