Выполнить ручной откат в среде JTA в EJB без сохранения состояния

1

У меня есть функция регистрации. В базе данных будет создана новая учетная запись пользователя, после чего будет отправлено приветственное письмо. Функция отправки электронной почты может выполнить освобождение. Если будет выбрано исключение, созданная учетная запись пользователя должна быть удалена. Проблемы состоят в том, что мои атрибуты bean-бэкэнда не будут выдаваться, только если будет отменено исключение. Мое исключение - это проверенное исключение. Либо мне нужно обернуть исключение, но я не могу ответить с надлежащим кодом статуса http (используя jax rs), или мне нужно выполнить ручной откат.

Может ли кто-нибудь помочь и предложить лучшее решение для моего сценария?

Благодарю!

Теги:
jpa
ejb
jta

1 ответ

3
Лучший ответ

Вы можете аннотировать ваше проверенное исключение с помощью аннотации: @ApplicationException (rollback = true).

например:

@ApplicationException(rollback = true)
public class MyApplicationException extends Exception{
}

Это будет означать текущую транзакцию для отката.

Редактировать:

Я не хочу использовать исключение для выполнения отката, потому что я не могу ответить с кодом состояния http

Другой альтернативой является явно отмечать транзакцию для отката с помощью метода SessionContext.setRollbackOnly(). Я не знаю вашего дизайна приложения, но примером может быть:

@Stateless
public class MyBean(){

    @Resource
    private SessionContext ctx;

    public void doSomething() {
        try {
            //code that sends a mail
        } catch (Exception e) {
            ctx.setRollbackOnly(); //the transaction will not commit
           //log exception

        }
    }
 }
  • 0
    Спасибо за ваш ответ, но я использую javamail и использую встроенное исключение MessagingException, если отправка не удалась. С другой стороны, я не хочу использовать исключение для выполнения отката, потому что я не могу ответить с кодом состояния http.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню