【发布时间】:2014-07-23 04:34:53
【问题描述】:
我想在我的 DAO 父类上配置事务,并禁止具体的 DAO 有自己的事务配置,所以我使用 Springs @Transactional:
@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 来执行我的设计规则。当我使用以下错误和切入点声明时,(合法)UserDao 中的代码也会出现错误,因为它继承了 AbstractDao 的注释。
@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";
是否可以只匹配显式注释的类(在本例中为DocumentDao)?
【问题讨论】:
标签: java annotations aop aspectj