2017-01-23 17 views
1

Я использую некоторые аспекты методов консультаций. У меня есть методы для контроллера, сервиса и репозитория.Добавление некоторых булевых условий в выражении pointcut

@Around("execution(* com.abc..controller..*(..)) && @annotation(audit)") 
    public Object controllerAround(ProceedingJoinPoint proceedingJoinPoint, Audit audit) throws Throwable { 
     //some code here 
     return output; 
    } 

@Around("execution(* com.abc..service.*Impl.*(..))") 
    public Object serviceAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { 
     //some code here 
     return output; 
    } 

@Around("execution(* com.abc..persistence.*Impl.*(..))") 
    public Object persistenceAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { 
     //some code here 
     return output; 
    } 

У меня есть запрос, который, мне нужно проверить в выражении метод Pointcut serviceAround, что, будь это происходит от метода controllerAround. Я попытался использовать некоторые флаги, но весна не поддерживает примитив pointcut if() pointcut.

Любое обходное решение для этого будет оценено по достоинству. :)

ответ

2

Что вам нужно, это cflow() или cflowbelow(), а не if(). Но это также not supported by Spring AOP. Таким образом, оставшееся решение заключается в использовании полной мощности AspectJ от Spring через LTW (временное ткачество). Как это делается, nicely documented.

срез точки будут выглядеть следующим образом:

execution(* com.abc..service.*Impl.*(..)) && 
cflow(
    execution(* com.abc..controller..*(..)) && 
    @annotation(customAnnotation) 
) 

Или проще, если вы не нуждаетесь в аннотации в методе совета:

execution(* com.abc..service.*Impl.*(..)) && 
cflow(execution(* com.abc..controller..*(..))) 

Внимание:cflow() работает только для потоков управления в пределах одного потока, а не, если, например, *Impl*.(..) выполнен в другом потоке, чем controller..*(..).

P.S .: Ваш пример кода, вероятно, не работает из-за несоответствия имени параметра между customAnnotation и audit.

+0

Проработанные конфигурации LTW и при создании проекта, показывающие «неподдерживаемый pointcut примитивный« cflow ». – Abhishek

+0

Тогда вы не использовали AspectJ LTW, а Spring AOP. – kriegaex

+0

Есть ли какие-нибудь другие обходные пути с примитивами, поддерживаемыми пружиной !! – Abhishek

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

  • Нет связанных вопросов^_^