2014-03-25 2 views
0

У меня есть реализация службы, несущая общеобязательную аннотацию @Transactional. У меня также есть аспект, который использует совет @Around для повторения неудачных транзакций. Я сейчас пытаюсь (по причинам, типа безопасности), чтобы сделать пометку определения на основе: срез точекПодсчет точек привязки Spring AOP для ElementType.TYPE?

@Around("@annotation(TransactionRetryable)") 

TransactionRetryable.java:

import java.lang.annotation.Retention; 
    import java.lang.annotation.RetentionPolicy; 
    import java.lang.annotation.Target; 
    import java.lang.annotation.ElementType; 

    @Retention(RetentionPolicy.RUNTIME) 
    @Target({ElementType.METHOD, ElementType.TYPE}) 
    public @interface TransactionRetryable { 
    } 

Сервис слой:

@Transactional 
public class ... { 
     @Override 
     @TransactionRetryable 
     public String forceError() { 
      throw new RuntimeException(someNastyMessage); 
     } 

В том формы, он применяется только к методу, а не целым классам. Однако аннотация @Transactional распространяется от уровня класса до каждого метода. Есть ли способ избежать добавления аннотации @TransactionRetryable выше каждого метода и просто один раз над классом, например аннотация @Transactional? Желаемая форма:

@Transactional 
@TransactionRetryable 
public class ... { 
     @Override 
     public String forceError() { 
      throw new RuntimeException(someNastyMessage); 
     } 

ответ

1

Этот срез точки советовали бы все публичные методы класса с аннотацией @TransactionRetryable:

@Around("execution(public * *(..)) && within(@your.package.TransactionRetryable *)") 
+0

есть ли возможность доступа к значению аргумента аннотации, если она была какая-то? – user1050755

+0

можно сделать pjp.getTarget(). GetClass(). GetAnnotation (TransactionRetryable.class) .value() ... – user1050755

Смежные вопросы