Мне нужно несколько указаний, как наилучшим образом использовать исключения в среде Java EE, обслуживая клиентов через JAX-RS.
На данный момент у меня есть ряд исключений, все расширяются RuntimeException
и помечены @ApplicationException(rollback=false)
. Чтобы транспортировать их клиентам, они несут JAXB-аннотированный объект; и ExceptionMapper
готов преобразовать их в правильные, значимые ответы HTTP (включая коды состояния HTTP).
У меня ничего не указано в отношении поведения транзакций, поэтому, по-моему, по умолчанию используется CMT.
Пока что здорово: когда сервер принимает решение, он не может выполнить запрос, потому что входные данные недопустимы / недостаточны / что-то еще, он выбрасывает один из моих BadRequestException
, что делает его ресурсом JAX-RS, где он сопоставляется с ответом HTTP. Клиент информирован о том, что пошло не так.
Проблема У меня есть то, что я всегда получаю javax.ejb.TransactionRolledbackLocalException
, вызванное BadRequestException
! Я не хочу, чтобы транзакция была отменена! Кажется, @ApplicationException игнорируется ...
Должен ли я не выходить из RuntimeException
, а использовать проверенные исключения? Хотя @ApplicationException должен был быть правильным ...
Для справочной информации: все мои исключения оставляют контейнер / компоненты в рабочем состоянии. Не нужно уничтожать экземпляр компонента или что-то в этом роде.