package com.acme.transaction; import javax.enterprise.inject.Instance; import javax.inject.Inject; import javax.interceptor.AroundInvoke; import javax.interceptor.Interceptor; import javax.interceptor.InvocationContext; import javax.transaction.UserTransaction; @Transactional @Interceptor public class TransactionInterceptor { @Inject private Instance<UserTransaction> tx; @AroundInvoke public Object aroundInvoke(final InvocationContext ctx) throws Exception { return new TransactionWorker() { public Object doWork() throws Exception { return ctx.proceed(); } }.workInTransaction(tx.get()); } }