AspectJ: параметр в pointcut - PullRequest
6 голосов
/ 05 ноября 2008

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

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

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

public void delete(Object item, Session currentSession);

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

public List listAll(Session currentSession);

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

Ответы [ 4 ]

8 голосов
/ 26 ноября 2008

Ну да ладно ... Я решил эту неприятную уловку. Все еще жду, когда кто-нибудь появится с "официальным" определением точки.

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 голосов
/ 10 июня 2009

Как насчет:

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

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

3 голосов
/ 01 мая 2017

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

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

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

3 голосов
/ 09 августа 2012

Я не могу расширить синтаксис 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());
    }
}

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

...