我正在尝试创建自定义注释以便快捷方式,正如文档中所引用的那样:
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional("order")
public @interface OrderTx {
}
但是,当我使用自定义注释注释方法时,我得到一个例外:
没有绑定到线程的hibernate会话,并且配置不允许创建...
等。虽然使用@Transactional
注释方法非常有效。
由于我正在注释的方法不属于从应用程序上下文实例化的Bean,我的猜测是AnnotationTransactionAspect
不能使用自定义注释,并且AOP魔法无效。
如何获得快速交易并在任何地方工作的自定义注释?
我错过了其他什么吗?
答案 0 :(得分:2)
以下是AnnotationTransactionAspect
中使用的切入点:
/**
* Matches the execution of any public method in a type with the
* Transactional annotation, or any subtype of a type with the
* Transactional annotation.
*/
private pointcut executionOfAnyPublicMethodInAtTransactionalType() :
execution(public * ((@Transactional *)+).*(..)) && @this(Transactional);
/**
* Matches the execution of any method with the
* Transactional annotation.
*/
private pointcut executionOfTransactionalMethod() :
execution(* *(..)) && @annotation(Transactional);
我会说非常清楚元注释不匹配(我甚至不认为有一个有效的aspectj切入点可以捕获元注释)。所以我想你必须继承AbstractTransactionAspect
并为这个切入点提供你自己的实现来捕获你的自定义注释:
/**
* Concrete subaspects must implement this pointcut, to identify
* transactional methods. For each selected joinpoint, TransactionMetadata
* will be retrieved using Spring's TransactionAttributeSource interface.
*/
protected abstract pointcut transactionalMethodExecution(Object txObject);