From 6117cc6c1009090735d4cb389358c00d734939e9 Mon Sep 17 00:00:00 2001 From: jomu Date: Wed, 6 Feb 2019 16:55:37 +0100 Subject: [PATCH] ensured transaction is rolled back in case a ControllerException occurs --- .../account/business/ControllerException.java | 2 +- .../AccountTransactionJoinInterceptor.java | 31 ++++++++++++++----- ...ApplicationTransactionJoinInterceptor.java | 30 ++++++++++++------ 3 files changed, 46 insertions(+), 17 deletions(-) diff --git a/account/src/main/java/de/muehlencord/shared/account/business/ControllerException.java b/account/src/main/java/de/muehlencord/shared/account/business/ControllerException.java index 4c0223b..4e6bdd6 100644 --- a/account/src/main/java/de/muehlencord/shared/account/business/ControllerException.java +++ b/account/src/main/java/de/muehlencord/shared/account/business/ControllerException.java @@ -19,7 +19,7 @@ package de.muehlencord.shared.account.business; * * @author joern.muehlencord */ -public class ControllerException extends RuntimeException { +public class ControllerException extends Exception { private static final long serialVersionUID = 5190280225284514859L; public static final int CAUSE_ALREADY_EXISTS = 1; diff --git a/account/src/main/java/de/muehlencord/shared/account/util/AccountTransactionJoinInterceptor.java b/account/src/main/java/de/muehlencord/shared/account/util/AccountTransactionJoinInterceptor.java index 7c819e6..4e102f5 100644 --- a/account/src/main/java/de/muehlencord/shared/account/util/AccountTransactionJoinInterceptor.java +++ b/account/src/main/java/de/muehlencord/shared/account/util/AccountTransactionJoinInterceptor.java @@ -15,6 +15,7 @@ */ package de.muehlencord.shared.account.util; +import de.muehlencord.shared.account.business.ControllerException; import javax.annotation.Priority; import javax.inject.Inject; import javax.interceptor.AroundInvoke; @@ -46,14 +47,30 @@ public class AccountTransactionJoinInterceptor { private EntityManager em; - @AroundInvoke + @AroundInvoke public Object joinTransaction(InvocationContext context) throws Exception { - if (em.isJoinedToTransaction()) { - LOGGER.trace("transaction already joined"); - } else { - LOGGER.trace("joining transaction"); - em.joinTransaction(); + try { + if (em == null) { + return context.proceed(); + } else { + if (em.isJoinedToTransaction()) { + LOGGER.trace("transaction already joined"); + } else { + LOGGER.trace("joining transaction"); + em.joinTransaction(); + } + } + return context.proceed(); + } catch (ControllerException ex) { + if (em.isJoinedToTransaction()) { + em.getTransaction().rollback(); + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("Transaction rolled back"); + } + } + throw ex; + } catch (Exception ex) { + throw ex; } - return context.proceed(); } } diff --git a/account/src/main/java/de/muehlencord/shared/account/util/ApplicationTransactionJoinInterceptor.java b/account/src/main/java/de/muehlencord/shared/account/util/ApplicationTransactionJoinInterceptor.java index 6790676..777181f 100644 --- a/account/src/main/java/de/muehlencord/shared/account/util/ApplicationTransactionJoinInterceptor.java +++ b/account/src/main/java/de/muehlencord/shared/account/util/ApplicationTransactionJoinInterceptor.java @@ -1,5 +1,6 @@ package de.muehlencord.shared.account.util; +import de.muehlencord.shared.account.business.ControllerException; import javax.annotation.Priority; import javax.inject.Inject; import javax.interceptor.AroundInvoke; @@ -31,17 +32,28 @@ public class ApplicationTransactionJoinInterceptor { @AroundInvoke public Object joinTransaction(InvocationContext context) throws Exception { - if (em == null) { - return context.proceed(); - } else { - if (em.isJoinedToTransaction()) { - LOGGER.trace("transaction already joined"); + try { + if (em == null) { + return context.proceed(); } else { - LOGGER.trace("joining transaction"); - em.joinTransaction(); + if (em.isJoinedToTransaction()) { + LOGGER.trace("transaction already joined"); + } else { + LOGGER.trace("joining transaction"); + em.joinTransaction(); + } } + return context.proceed(); + } catch (ControllerException ex) { + if (em.isJoinedToTransaction()) { + em.getTransaction().rollback(); + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("Transaction rolled back"); + } + } + throw ex; + } catch (Exception ex) { + throw ex; } - return context.proceed(); } - }