Frage

Ich bin mit AspectJ die öffentlichen Methoden alle beraten, die ein Argument einer ausgewählten Klasse verfügen. Ich habe versucht, die folgenden:

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

Das funktioniert wunderbar für Verfahren mit mindestens zwei Argumente:

public void delete(Object item, Session currentSession);

, aber es funktioniert nicht mit Methoden wie:

public List listAll(Session currentSession);

Wie kann ich meine pointcut ändere beiden Methoden Ausführungen zu beraten? Mit anderen Worten: Ich erwartete den „..“ Wildcard, um ‚null oder mehr Argumente‘, aber es sieht so bedeutet es stattdessen ‚eine oder mehr‘ ...

War es hilfreich?

Lösung

Na ja ... ich gearbeitet, dass um mit diesem bösen Streich. Noch warten, dass jemand mit einer „offiziellen“ pointcut Definition zu zeigen.

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);
}

Andere Tipps

Wie wäre:

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

Ich denke, dieses Spiel wird, wenn letzte (oder einzige) Argument vom Typ Session ist. Durch Vertauschen der Positionen von args können Sie auch nur im ersten oder-Match. Aber ich weiß nicht, ob jede beliebige Position möglich ist, übereinstimmt.

Ich kann nicht verlängern AspectJ Syntax für Sie, aber ich kann eine Abhilfe bieten. Aber zuerst lassen Sie mich erklären, warum es nicht möglich ist, zu tun, was man in einem pointcut mit einer args Definition wollen: denn wenn Sie Ihre EhealthSession Parameter an jedem Ort innerhalb der Methodensignatur entsprechen würde, wie sollte AspectJ den Fall behandeln, die die Signatur enthält mehrere Parameter diese Klasse? Die Bedeutung von eheSess wäre mehrdeutig sein.

Nun ist die Abhilfe: Es könnte langsamer sein - wie viel hängt von Ihrer Umgebung, es ist einfach zu testen - aber man konnte nur noch die pointcut Spiel alle möglichen Methoden, unabhängig von ihrer Parameterliste und lassen Sie dann den Rat der Parameter finden Sie müssen durch inspizieren der Parameterliste:

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

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

P. S .: Vielleicht können Sie den Fokus über within(SomeBaseClass+) oder within(*Postfix) oder within(com.company.package..*) verengen, um nicht die Beratung für das gesamte Universum anzuwenden.

Sie müssen .. (doppelte Punkte) am Ende und den Anfang wie folgt verwenden:

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

Auch bekommen rid off && args(*, sess), weil das bedeutet, dass Sie nur die Methoden mit welcher Art auch immer für die erste param aber sess als zweiter param und nicht mehr als 2 params auch zu fangen erwarten ..

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top