Frage

Mein Projekt basiert auf Spring Framework 2.5.4.Und ich versuche, Aspekte für einige Controller hinzuzufügen (ich verwende Aspectj 1.5.3).

Ich habe Auto-Proxy in application-servlet.xml aktiviert und einfach diese Zeilen an das Ende der XML-Datei eingefügt:

<aop:aspectj-autoproxy />
<bean id="auditLogProcessor" class="com.example.bg.web.utils.AuditLogProcessor" />

Erstellter Aspekt:

package com.example.bg.web.utils;

import org.apache.log4j.Logger;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class AuditLogProcessor
{
    private final static Logger log = Logger.getLogger(AuditLogProcessor.class);

    @After("execution(* com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail(..))")
    public void afterHandleRequest() {
        log.info("test111");
    }

    @After("execution(* com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail(..))")
    public void afterRebuildThumbnail() {
        log.info("test222");
    }
}

Meine Controller:

class AssetAddController implements Controller
class AssetThumbnailRebuildController extends MultiActionController

Wenn ich Bremspunkte in Aspektberatern setze und Controller aufgerufen habe, fange ich nur nach der HandleRequest (), aber nicht nach rebildThumbnail () was habe ich falsch gemacht?

NOTIZ

Ich stelle diese Frage im Namen meines Freundes, der keinen Zugang zur SO-Beta hat, und ich habe keine Ahnung, worum es geht.

BEARBEITEN

Es gab tatsächlich einige Rechtschreibfehler, danke Cheekysoft.Aber das Problem besteht weiterhin.

War es hilfreich?

Lösung

Ihre Haltepunkte werden nicht erreicht, weil Sie die AOP-Proxys von Spring verwenden.Sehen AOP-Proxys verstehen Hier finden Sie eine Beschreibung der Besonderheiten von AOP-Proxys.

Im Grunde wird das MVC-Framework das aufrufen handleRequest Methode auf dem Proxy Ihres Controllers (z. B. die MultiActionController Sie als Basisklassenimplementierung verwenden), führt diese Methode dann einen „internen“ Aufruf an ihre rebuildThumbnail-Methode durch, dieser geht jedoch nicht über den Proxy und erfasst daher keine Aspekte.(Dies hat nichts damit zu tun, dass die Methoden endgültig sind.)

Um das zu erreichen, was Sie wollen, untersuchen Sie die Verwendung von „echtem“ AOP über Load Time Weaving (was Spring sehr gut unterstützt).

Andere Tipps

AspectJ funktioniert nicht gut mit Klassen im Spring Web MVC-Framework. Lesen Sie den unteren Teil des Felds „Zur Verlängerung öffnen…“ auf der rechten Seite

Werfen Sie stattdessen einen Blick auf die HandlerInterceptor Schnittstelle.

Die neuen Spring MVC Annotations funktionieren möglicherweise auch, da die Controller-Klassen dann alle POJOs sind, aber ich habe es selbst nicht ausprobiert.

Das Grundsetup sieht ok aus.

Die Syntax kann leicht vereinfacht werden, indem kein direkter Pointcut definiert wird, sondern nur die Methode angegeben wird, auf die der Nachhinweis angewendet werden soll.(Die benannten Pointcuts für Methoden werden automatisch für Sie erstellt.)

z.B.

@After( "com.example.bg.web.controllers.assets.AssetAddController.handleRequest()" )
public void afterHandleRequest() {
    log.info( "test111" );
}

@After( "com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail()" )   
public void afterRebuildThumbnail() {
    log.info( "test222" );
}

Solange die rebuildThumbnail-Methode nicht endgültig ist und der Methodenname und die Klasse korrekt sind.Ich verstehe nicht, warum das nicht funktionieren wird.

sehen http://static.springframework.org/spring/docs/2.0.x/reference/aop.html

Ist das so einfach wie die Rechtschreibung?Oder sind in der Frage nur Tippfehler enthalten?Manchmal schreibst du rebuildThumbnail und manchmal schreibst du rebildThumbnail

Die Methoden, die Sie mit Ratschlägen überschreiben möchten, sind keine endgültigen Methoden im MVC-Framework. Die Antwort von bpapas ist zwar nützlich, aber ich verstehe, dass dies in diesem Fall nicht das Problem ist.Stellen Sie jedoch sicher, dass die rebuildThumbnail Die Aktion des Controllers ist nicht endgültig

@bpapas:Bitte korrigiere mich wenn ich falsch liege.Der Programmierer versucht, die eigene Controller-Aktion außer Kraft zu setzen.Wenn man sich die MultiActionController-Quelle (und die ihrer übergeordneten Elemente) ansieht, ist dies die einzige finalisierte Methode, die möglicherweise im Stapel vorhanden ist MultiActionController.invokeNamedMethod, obwohl ich nicht 100 % sicher bin, ob dies zu diesem Zeitpunkt im Stapel war oder nicht.Würde eine finalisierte Methode weiter oben im Stapel ein Problem beim Hinzufügen von AOP-Hinweisen zu einer Methode weiter unten verursachen?

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