2013-01-19 5 views
1

У меня есть аннотация для пользовательского метода (@EventListener), который я использую в методе внутри класса с аннотацией @Transactional.Имеет ли примечание @Transactional Spring примечание других аннотаций

Ниже приведен пример класса

@Component 
@Transactional 
public class someClass { 

    @EventListener 
    public void someMethod() { 

    } 
} 

Класс находится в пакете, включают в контексте файлов компонент сканирования. В другом классе, который реализует ApplicationContextAware, я проверяю методы классов, если у них есть аннотация @EventListener. По какой-то странной причине, когда @Transactional присутствует в классе, моя пользовательская аннотация теряется.

Это, как я проверить метод аннотаций:

общественного объекта postProcessAfterInitialization (боб Object, String beanName) бросает BeansException {

System.out.println("SCANNING :::::: " + beanName); 

    for (Method method : bean.getClass().getMethods()) { 

     for(Annotation a : method.getAnnotations()) { 
      System.out.println("\t>>>>> " + a.toString()); 
     } 

    ... 

Есть ли способ использовать @Transactional без него портя с другими аннотациями метода в классе, который он комментирует?

Редактировать: Я нашел это после того, как я разместил Spring - @Transactional - What happens in background?. Кажется, что-то вроде прокси создается, и это может привести к тому, что мои аннотации «исчезнут». Есть ли способ получить ссылку на исходный класс?

ответ

2

Я нашел ansewr на свой вопрос и разместил его здесь, если у кого-то другая проблема. Поскольку @Transactional классов проксированные, мне нужно, чтобы получить исходный класс прокси-соединение, так что я добавил следующее:

Class clazz; 

    // if this was proxied by Spring, get the original class name 
    clazz = AopUtils.getTargetClass(bean); 
    if(clazz == null) { 
     clazz = bean.getClass(); 
    } 

    for (Method method : clazz.getMethods()) { 

Я использовал AopUtils.getTargetClass бы получить исходный класс, если он возвращается нулем означает, что класс не был прокси, поэтому я просто использую bean.getClass()

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