Пользовательские аннотации ярлыков для @Transactional не работают - PullRequest
6 голосов
/ 23 мая 2011

Я пытаюсь создать пользовательские аннотации для быстрого доступа, как указано в документации:

   @Target({ElementType.METHOD, ElementType.TYPE})
   @Retention(RetentionPolicy.RUNTIME)
   @Transactional("order")
   public @interface OrderTx {
   }

Однако, когда я аннотирую методы с помощью пользовательской аннотации, я получаю исключение:

Сеанс гибернации не связан с потоком, и конфигурация не позволяет создавать ...

и т. Д.Хотя аннотирование метода с помощью @Transactional работает отлично.

Поскольку метод, который я комментирую, не принадлежит Бину, созданному из контекста приложения, я предполагаю, что AnnotationTransactionAspect не работает с пользовательскими аннотациями,и магия AOP не работает.

Как получить пользовательские аннотации, которые делают ярлыки транзакций и работают везде?

Я что-то упустил?

1 Ответ

2 голосов
/ 24 мая 2011

Вот точки, используемые в 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);

Я бы сказал, что довольно ясно, что метааннотации не совпадают (и я даже не думаю, что существует допустимый точечный вырез аспекта, который может перехватить метааннотации). Поэтому, я думаю, вам придется создать подкласс AbstractTransactionAspect и предоставить собственную реализацию для этого pointcut, чтобы перехватить пользовательскую аннотацию:

/**
 * 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);
...