2008-11-05 7 views
6

Я использую AspectJ, чтобы советовать всем общедоступным методам, которые имеют аргумент выбранного класса. Я попытался следующие:AspectJ: параметр в pointcut

Это прекрасно работает для методов, по крайней мере 2 аргумента:

public void delete(Object item, Session currentSession); 

но это не работает с методами, как:

public List listAll(Session currentSession); 

как я могу изменить мой pointcut на рекомендации обоих методов исполнения? Другими словами, я ожидал, что символ «..» будет представлять «ноль или больше аргументов», но похоже, что это означает «один или несколько» ...

ответ

7

О, хорошо ... Я работал так с этот неприятный трюк. Все еще ждет, пока кто-то появится с «официальным» определением pointcut.

pointcut permissionCheckMethods(EhealthSession eheSess) : 
    (execution(public * *(.., EhealthSession)) && args(*, eheSess)) 
    && !within(it.___.security.PermissionsCheck); 

pointcut permissionCheckMethods2(EhealthSession eheSess) : 
    (execution(public * *(EhealthSession)) && args(eheSess)) 
    && !within(it.___.security.PermissionsCheck) 
    && !within(it.___.app.impl.EhealthApplicationImpl); 

before(EhealthSession eheSess) throws AuthorizationException : permissionCheckMethods(eheSess) 
{ 
    Signature sig = thisJoinPointStaticPart.getSignature(); 
    check(eheSess, sig); 
} 

before(EhealthSession eheSess) throws AuthorizationException : permissionCheckMethods2(eheSess) 
{ 
    Signature sig = thisJoinPointStaticPart.getSignature(); 
    check(eheSess, sig); 
} 
4

Как насчет:

pointcut permissionCheckMethods(Session sess) : 
(execution(public * *(..)) && args(.., sess)); 

Я предполагаю, что это будет соответствовать, если последний (или единственный) аргумент типа сессии. Переставляя позиции args, вы также можете сопоставить первое или единственное. Но я не знаю, возможно ли совпадение произвольной позиции.

+0

Соответствие любому произвольному положению невозможно. – 2017-10-03 20:47:46

3

Я не могу расширить синтаксис AspectJ для вас, но я могу предложить обходное решение. Но сначала позвольте мне объяснить, почему невозможно сделать то, что вы хотите, с определением args в pointcut: потому что, если вы будете сопоставлять свой параметр EhealthSession в любом месте в сигнатуре метода, как AspectJ обрабатывает случай, когда подпись содержит несколько параметров этот класс? Значение eheSess было бы неоднозначным.

Теперь обходной путь: он может быть медленнее - насколько это зависит от вашей среды, просто проверьте его - но вы можете просто привязать pointcut ко всем потенциальным методам независимо от их списка параметров, а затем дать совет найти нужный вам параметр путем проверки списка параметров:

pointcut permissionCheckMethods() : execution(public * *(..)); 

before() throws AuthorizationException : permissionCheckMethods() { 
    for (Object arg : thisJoinPoint.getArgs()) { 
     if (arg instanceof EhealthSession) 
      check(arg, thisJoinPointStaticPart.getSignature()); 
    } 
} 

PS: может быть, вы можете сузить фокус с помощью within(SomeBaseClass+) или within(*Postfix) или within(com.company.package..*), чтобы не применять советы для всей вселенной.

2

Вы должны использовать .. (двойные точки) в конце и начале следующим образом:

pointcut permissionCheckMethods(Session sess) : 
    (execution(public * *(.., Session , ..))); 

также избавиться от && args(*, sess) потому что это означает, что вы ожидаете, чтобы поймать только те методы, с каким-либо типом для первый параметр, но sess в качестве второго параметра и не более 2 параметров.

+0

@Manrico Corazzi вы должны отметить это как решение своей проблемы. Поэтому другие не будут отвлекаться от других работ – Iomanip 2018-02-08 17:19:30

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

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