Java EE: @ApplicationException выброшено, все еще откатывает транзакции - PullRequest
3 голосов
/ 08 июня 2011

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

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

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 18 июля 2013

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

Мне помогло то, что вы смотрите -> https://www.java.net//node/665096

2 голосов
/ 08 июня 2011

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

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

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

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

...