私は、CDI (溶接) と JPA (休止状態) を備えたサーブレットコンテナー (Tomcat) でのみ作業しています。「トランザクション」インターセプターを作成する多くの例をオンラインで見つけました。
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.interceptor.InterceptorBinding;
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@InterceptorBinding
public @interface Transactional {}
@Transactional
@Interceptor
public class TransactionalInterceptor {
@Inject EntityManager em;
@AroundInvoke
public Object wrapInTransaction(InvocationContext invocation) throws Exception {
boolean transactionOwner = !isTransactionInProgress();
if (transactionOwner) {
em.getTransaction().begin();
}
try {
return invocation.proceed();
}
catch (RuntimeException ex) {
em.getTransaction().setRollbackOnly();
throw ex;
}
finally {
if (transactionOwner) {
if (em.getTransaction().getRollbackOnly()) {
em.getTransaction().rollback();
}
else {
em.getTransaction().commit();
}
}
}
}
private boolean isTransactionInProgress() {
return em.getTransaction().isActive();
}
}
そして、これは私のローカルコードでうまく機能します。ただし、このトランザクション アノテーション (インターセプター) を、私が書いていないコード (つまり、私が使用しているライブラリ コード) に適用できるようにしたいと考えています。私の場合は、CDI インターセプターを Struts2 インターセプターに適用して、リクエストの処理全体でトランザクションが開かれるようにすることを望んでいました。
この Transactional インターセプターをこのようにライブラリ コードに適用するにはどうすればよいですか?
編集これは、Spring XML を介して以前に行ったことです。
<!-- TRANSACTIONAL DEMARCATION -->
<aop:config>
<aop:pointcut id="transactionalPointCut" expression="execution(* utils.struts2.interceptor.TransactionInterceptor.intercept(..))"/>
<aop:advisor pointcut-ref="transactionalPointCut" advice-ref="transactionalAdvice"/>
</aop:config>
...
しかし、私はCDIの代替品を探しています。