2008-11-05 18 views
6

Używam AspectJ do poradzenia sobie z wszystkimi publicznymi metodami, które mają argument wybranej klasy. Próbowałem następujące:AspectJ: parametr w wycinku

To działa wspaniale dla metod z co najmniej 2 argumenty

public void delete(Object item, Session currentSession); 

ale to nie działa z metod, takich jak:

public List listAll(Session currentSession); 

jak mogę zmienić mój punkt odniesienia, aby doradzić obu metodom wykonania? Innymi słowy: spodziewałem się, że ".." symbolizuje "zero lub więcej argumentów", ale wygląda na to, że oznacza "jeden lub więcej" ...

Odpowiedz

7

No cóż ... Pracowałem nad tym z ta paskudna sztuczka. Nadal czekam, aż ktoś pojawi się z "oficjalną" definicją 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

Jak o:

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

Myślę, że to będzie pasować, jeśli ostatnia (lub tylko) argument jest typu sesji. Zamieniając pozycje argumentów, możesz także dopasować pierwszy lub jedyny. Ale nie wiem, czy możliwe jest dopasowanie dowolnej arbitralnej pozycji.

+0

dopasowanie dowolnej dowolnej pozycji nie jest możliwe. –

3

Nie mogę rozszerzyć składni AspectJ, ale mogę zaoferować obejście. Ale najpierw pozwól mi wyjaśnić, dlaczego nie jest możliwe zrobienie tego, co chcesz, z definicją args w wycinku: ponieważ jeśli chcesz dopasować swój parametr EhealthSession do dowolnego miejsca w sygnaturze metody, jak powinien AspectJ obsługiwać przypadek, w którym podpis zawiera wiele parametrów ta klasa? Znaczenie eheSess byłoby niejednoznaczne.

Obejście problemu: może być wolniejsze - ile zależy od twojego środowiska, po prostu je przetestuj - ale możesz po prostu dopasować punkt do wszystkich potencjalnych metod, niezależnie od ich listy parametrów, a następnie niech poradnik znajdzie potrzebny parametr sprawdzając listę parametrów:

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

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

PS: może można zawęzić ostrości poprzez within(SomeBaseClass+) lub within(*Postfix) lub within(com.company.package..*) tak aby nie stosować porady dla całego wszechświata.

2

Musisz użyć .. (podwójne punkty) na końcu i na początku następująco:

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

także pozbyć się && args(*, sess) bo to oznacza, że ​​można oczekiwać, aby złapać tylko te metody z jakiegokolwiek typu dla pierwszy parametr, ale sess jako drugi parametr i nie więcej niż 2 parametry.

+0

@Manrico Corazzi należy oznaczyć jako rozwiązanie problemu. Więc inni nie zostaną przekierowani z innych prac dookoła – Iomanip

Powiązane problemy