Java EE: @ApplicationException выбрасывает, по-прежнему откатывает транзакции

Мне нужно какое-то направление, как наилучшим образом использовать исключения в среде Java EE, обслуживая клиентов через JAX-RS.

В настоящий момент у меня есть ряд исключений, все расширяющиеся RuntimeException и аннотированные с помощью @ApplicationException(rollback=false). Чтобы передать их клиентам, они несут аннотированный объект JAXB; и ExceptionMapper готов преобразовать их в надлежащие, значимые HTTP-ответы (включены коды состояния HTTP).

У меня ничего не сказано о транзакционном поведении, поэтому я думаю, что он по умолчанию относится к CMT.

Отличный материал: когда сервер решает, он не может выполнить запрос, потому что входные данные недействительны/достаточны/нет, он выбрасывает один из моих BadRequestException, что делает его ресурсом JAX-RS, где он сопоставляется с HTTP-ответом. Клиент информирован о том, что пошло не так.

Проблема У меня есть то, что я всегда получаю javax.ejb.TransactionRolledbackLocalException, вызванный BadRequestException! Я не хочу, чтобы транзакция была отменена! Исключение @ApplicationException игнорируется...

Должен ли я не распространяться от RuntimeException, а использовать проверенные исключения? Я, хотя @ApplicationException должен был быть правильным способом...

Для справочной информации: все мои Исключения оставляют контейнер / beans в рабочем состоянии. Не нужно уничтожать экземпляр bean или что-то вроде этого.

2 ответа

Хорошо, получается, что чтение руководств иногда помогает:).

An @ApplicationException по определению не a RuntimeException. На самом деле бросать RuntimeExceptions представляется очень плохой идеей, что приведет к срыву экземпляров bean, отката транзакций и т.д.

После переключения всех на основе отмеченных исключений мой код не только выглядит намного лучше, но и IDE поддерживает меня намного лучше. И это работает как шарм. Теперь я могу контролировать, если мой ApplicationException должен вызвать откат транзакции или нет.

Я нашел эту ссылку полезной, даже если она описывает ее для Bea Weblogic.


Для других, борющихся с одной и той же проблемой: Annotation @ApplicationException игнорируется (не проверяется/не обрабатывается), когда класс исключения не включен в ejb-jar. Это обычный случай, когда наше ApplicationException является частью java-интерфейса API. В этом случае мы должны использовать дескриптор XML для отметки ApplicationException.

Глядя сюда помог → https://www.java.net//node/665096

licensed under cc by-sa 3.0 with attribution.