Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Что-то не так с AspectJ 5 expression


Автор: alivesubstance 10.1.2011, 23:36
Всем привет.

Сел разобраться с аспектами, с реализацией из spring. Возникло желание осуществить следующее. Представим, что есть какой-то класс сервиса, каждый метод которого помечен как @Transactional. Свои обязанности он делегирует различным классам. 
Пусть эти классы имплементят интерфейс Parent. Хочу написать аспект с around advice, который будет отслеживать вызов метода сервиса и настроить параметр target, так что ProceedingJoinPoint.getTarget() вернет мне потомка класса Parent.

Код

class app.domain.ChilOne implements app.domain.Parent {...}
class app.domain.ChidTwo implements app.domain.Parent {...}

interface app.service.Service
{
    void doIt( SomeObject obj );
}

class app.service.ServiceImpl implements Service {
@Autowired
public ChildOne childOne;

@Autowired
public ChildTwo childTwo;

public void doIt( SomeObject obj )
{
     childOne.doIt( obj );  
}

public void doItAgain( SomeObject obj )
{
     childTwo.doIt( obj );  
}


Вот так можно повесить аспект на все методы интерфейса Service:
Код

@Around( "execution(* app.service.Service.*(..))" )


Вот так пишется в мануале spring можно повесить на все методы с аннотацией @Transactional, но у меня не получается, не работает:
Код

@Around("@annotation(org.springframework.transaction.annotation.Transactional)")


А так, если хотим перехватывать методы во всех потомках Parent:
Код

@Around("target(app.domain.Parent)")


Но мне не нужно вешать на все методы потомков, а только на те, которые вызывались из Service. То есть по моим соображениям должно быть что-то типа
Код

@Around( "within(app.service.Service) && target(app.domain.Parent)" )

или

@Around( "this(app.service.Service) && target(app.domain.Parent)" )

или 

@Around( "this(app.service.Service) && execution(public * *(..)) && target(app.domain.Parent)")


но нифига не помогает. Как можно такое осуществить?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)