2014-07-21 55 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的子類。但無論如何,我更喜歡下面的第二個答案。 –