2014-07-21 100 views
1

我想在我的DAO的父类配置的交易,并禁止一个具体的DAO都有自己的事务的配置,所以我用温泉@TransactionalAspectJ的匹配注解的类,但不是它的子类

@Transactional(/* some transactionConfig */) 
abstract class AbstractDao 
{ 
    //... 
} 

// this is ok 
class UserDao extends AbstractDao 
{ 
    //... 
} 

@Transactional (/* some other config*/) // this should be illegal 
class DocumentDao extends AbstractDao 
{ 
    //... 
} 

我用AspectJs @DeclareError执行我的设计规则。当我使用followint错误和切入点声明时,我也会在(法定)UserDao中的代码中获取错误,因为它继承了AbstractDao中的Annotation。

@Pointcut("call(*.new(..)) || call(* *(..)) || set (* *) || get (* *)") 
public void doAnything() 
{ 
    // no code 
} 

@Pointcut("within(@org.springframework.transaction.annotation.Transactional *) && doAnything()") 
public void transactionalClass() 
{ 
    // only pointcut, no code 
} 

@Pointcut("within(AbstractDao+) && !within(AbstractDao)") 
public void inDao() 
{ 
    // no code 
} 

@DeclareError("transactionalMethod() && doAnything() && inDao()") 
public static final String TRANSACTIONAL_NOT_ALLOWED = 
     "@Transactional of this method is not necesarry, we have it on class level in AbstractDao"; 

@DeclareError("transactionalClass() && inDao() && doAnything()") 
public static final String ERROR = "Transactional is not allowed on method level"; 

是否有可能只匹配那些explicitelty注释(在这个例子中DocumentDao)班?

回答

-1

因此,我认为您正在寻找在AbstractDao的子类中的方法或类中捕获@Transactional的用法。假如是这样的话,下面应该工作:

@Pointcut("within(AbstractDao+) && !within(AbstractDao)") 
public void inDao() 
{ 
    // no code 
} 

@Pointcut("within(@org.springframework.transaction.annotation.Transactional *)") 
public void transactionalClass() 
{ 
    // no code 
} 

@Pointcut("withinCode(@org.springframework.transaction.annotation.Transactional *.*(..))") 
public void transactionalMethod() 
{ 
    // no code 
} 

@DeclareError("(transactionalMethod() || transactionalClass()) && inDao()") 
public static final String TRANSACTIONAL_NOT_ALLOWED = "NOT ALLOWED!"; 

我还没有真正尝试了这一点,所以你可能需要的切入点一些调整,但是这是一种应该工作的事情。


编辑:更简洁的回答是这样的:

pointcut transactionsNotAllowed() : (within(@Transactional AbstractDao+) || 
    execution(@Transactional * AbstractDao+.*(..))) && !within(AbstractDao); 

这应该为你工作。它使用代码风格的aspectj语法,我发现它更直观。

+0

这是我的第一个想法bit transactionaClass匹配所有的DAO类,因为它们从具有@Transactional注解的AbstractDao继承而来,不仅仅是那些具有明确注释的类。 –

+0

我不跟着你。尽管transactionaClass与所有DAO对象相匹配,但最终的切入点是受限的,因此只考虑DAO的子类。但无论如何,我更喜欢下面的第二个答案。 –