2
我只在具有CDI(焊接)和JPA(休眠)的Servlet容器(Tomcat)中工作。我发现在网上建立一个“事务性”拦截器的例子很多:CDI:如何将拦截器应用于库(第三方)代码?
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();
}
}
而且在我的本地代码这个伟大工程。但是,我希望能够应用这个Transactional注解(拦截器)来编写我没有写的代码(即我使用的库代码)。就我而言,我希望将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替代。
如果它有所作为,我正在使用CDI 1.1(焊接2.0.0)。我会看看DeltaSpike来帮助我在'BeforeBeanDiscovery'观察事件中创建一个新的'AnnotatedType'。感谢您指点我正确的方向。 – 2013-05-14 15:04:24
没问题,希望对你有用。 – LightGuard 2013-05-14 18:32:11