2015-09-09 1 views
1

Что случилось? люди!AspectJ pointcut выражение для всех классов, которое содержит определенное слово в их именах

Я пытаюсь перехватить все классы, которые содержат определенное слово в их именах ... что-то, как показано ниже:

@Before("execution(* com.domain.model.*.*Repository.save(..))") 

У меня есть следующие способы перехвата:

com.domain.model.user.UserRepository.save(User user); 
com.domain.model.xpto.XPTORepository.save(XPTO xpto); 
com.domain.model.foo.FooRepository.save(Foo foo); 

I пробовал это: (работал, но выглядит ужасно)

@Before("execution(* *.save(..)) && within(com.domain.model..*)") 
public void validateBeforeSave(final JoinPoint jp) throws Throwable { 
    if (jp.getSignature().toString().contains("Repository.")) { 
     ... 
    } 
} 

Спасибо !!!

ответ

0

В чем проблема с вашим предложением?

execution(* com.domain.model.*.*Repository.save(..)) 

должен хорошо работать с образцом пакета + имена классов, которые вы предоставили. Если это не работает, реальные имена пакетов различаются, например. у вас есть более одного подпакета ниже model. В этом случае вы можете сделать срез точек более общий характер, используя .. конструкцию, которая также используется в вашей безобразной обходного:

execution(* com.domain.model..*Repository.save(..)) 

Или, может быть, ваши *Repository классы все унаследует от общего суперкласса или реализовать тот же интерфейс, например, interface com.domain.model.Repository или abstract class com.domain.model.BaseRepository. В этом случае можно обойтись без сопоставления строки и просто использовать что-то вроде

execution(* com.domain.model.Repository+.save(..)) 

или

execution(* com.domain.model.BaseRepository+.save(..)) 

+ означает «этот класс и все его подклассы».

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