package net.curisit.securis.ioc; import java.io.IOException; import java.lang.reflect.Method; import javax.inject.Inject; import javax.interceptor.AroundInvoke; import javax.interceptor.Interceptor; import javax.interceptor.InvocationContext; import javax.persistence.EntityManager; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.core.Response.Status; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jboss.resteasy.core.ResourceMethodInvoker; import org.jboss.resteasy.spi.ResteasyProviderFactory; import com.google.inject.persist.Transactional; @Interceptor @MyTrans public class TransactionsManager { private static final Logger LOG = LogManager.getLogger(TransactionsManager.class); @Inject private EntityManager em; // @Inject // private ThreadLocal threadLocal; @AroundInvoke public Object invoke(InvocationContext context) throws Exception { // EntityTransaction trx = manager.getTransaction(); if (!em.getTransaction().isActive()) { em.getTransaction().begin(); LOG.info("INIT trans"); ResteasyProviderFactory.pushContext(EntityManager.class, em); Object result = context.proceed(); em.getTransaction().commit(); LOG.info("COMMIT trans"); return result; } LOG.info("No trans"); Object result = context.proceed(); return result; } public void filter(ContainerRequestContext requestContext) throws IOException { ResourceMethodInvoker methodInvoker = (ResourceMethodInvoker) requestContext.getProperty("org.jboss.resteasy.core.ResourceMethodInvoker"); Method method = methodInvoker.getMethod(); if (method.isAnnotationPresent(Transactional.class)) { LOG.info("WE need transaction!!!"); em.getTransaction().begin(); } } public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { // TODO Auto-generated method stub if (em.getTransaction().isActive()) { LOG.info("There is transaction go ahead..."); if (responseContext.getStatus() == Status.OK.getStatusCode()) { em.getTransaction().commit(); LOG.info("COMMIT"); } else { em.getTransaction().rollback(); LOG.info("ROLLBACK"); } } else { LOG.info("There is NO transaction"); } } }