2013-05-13 58 views
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替代。

回答

2

这对于CDI 1.0来说变得困难。你必须打开jar并在META-INF中添加一个beans.xml文件,重新打包这个jar文件并在你的战争中(我认为这是一场战争)创建一个可移植的扩展,将元数据拦截器注释添加到类中。您需要注意BeforeBeanDiscovery并添加新的AnnotatedType。 DeltaSpike可以帮助那部分。

+0

如果它有所作为,我正在使用CDI 1.1(焊接2.0.0)。我会看看DeltaSpike来帮助我在'BeforeBeanDiscovery'观察事件中创建一个新的'AnnotatedType'。感谢您指点我正确的方向。 – 2013-05-14 15:04:24

+0

没问题,希望对你有用。 – LightGuard 2013-05-14 18:32:11

相关问题