tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
886
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    DarthShader DarthShader ist offline Mitglied Platin
    Registriert seit
    May 2004
    Beiträge
    684
    Hallo zusammen,

    ich habe eine Frage bezüglich AOP, der Verwendung von Spring / AspectJ / CGLIB. Ich scheine alles korrekt eingebunden und konfiguriert zu haben, dennoch wird mein Advice, der einfach vor einem Methodenaufruf testweise etwas auf der Konsole ausgeben soll, nicht aufgerufen.

    Der entscheidende Teil meiner Context-Konfiguration sieht so aus:

    Code xml:
    1
    2
    3
    4
    
    <context:load-time-weaver aspectj-weaving="on" />
    <aop:aspectj-autoproxy proxy-target-class="true" />
     
    <bean id="testAspect" class="de.test.aop.TestAspect" />

    Die Klasse TestAspect sieht so aus:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    
    @Aspect
    public class TestAspect {
     
        @Before( "execution(public void de.test.LoginController.login())" )
        public void doBefore() {
            System.err.println( "doBefore()" );
        }
    }

    Die Methode
    Code java:
    1
    
    de.test.LoginController.login()
    ist sehr einfach gehalten:

    Code java:
    1
    2
    3
    4
    5
    6
    
    public void login()
    {
      System.err.println( "login()" );
     
      // Weiterer Code hier
    }

    Das Programm starte ich mit dem Parameter

    Code :
    1
    
    -javaagent:../Lib/lib/Spring/spring-agent.jar


    Problem:

    Wenn die Methode "login()" innerhalb des Programmes aufgerufen wird, was ich an der Ausgabe "login()" sehe, dann wird der Advice aber nicht ausgeführt, d.h. ich sehe kein "doBefore()" auf der Konsole - es werden auch keine Exceptions geworfen.

    Weitere Informationen:
    • Das Programm läuft in keinem Application Container, ist keine Web-Application
    • Es handelt sich um eine "normale" Spring Application
    • Die Klasse "LoginController" ist eine Spring Bean, allerdings hatte ich es auch auf einer normalen Klasse getestet, die via "new" zur Laufzeit instanziiert wird, auch damit ging es nicht

    Erkenntnisse:
    • Die Libs sind korrekt eingebunden (würde eine fehlen, gäbe es schon Meldungen beim Start, das habe ich bereits hinter mir...), eingebunden sind: spring.jar, spring-aspects.jar, spring-agent.jar, aspectjrt.jar, aspectjweaver.jar
    • Der Java-Agent wird gefunden, sonst würde die JVM beim Start eine entsprechende Fehlermeldung ausgeben
    • Wenn ich von CGLIB auf Spring AOP mit Interfaces umstelle, funktioniert der Advice. D.h. wenn "LoginController" ein Interface ist, in dem die "login()" Methode definiert wurde, klappt es. Sobald ich ein Proxy einer Klasse mit CGLIB erstellen will, klappt es nicht mehr (leider bin ich auf Load-Time-Weaving / AspectJ und damit CGLIB angewiesen)
    • Der Aspekt (TestAspect) wird auch "bachtet", d.h. wenn ich den Ausdruck in @Before auf etwas ungültiges setze, dann meckert der Parser von AspectJ

    Unsicherhiten / Offene Fragen:
    • Ich habe keine META-INF/aop.xml Konfigurationsdatei, aber wenn ich es richtig verstehe, ist dies auch nicht nötig, wenn ich
      Code :
      1
      
      aspectj-weaving="on"
      (siehe oben) angebe, so wie ich es gemacht habe (wie oben erwähnt funktioniret es ja auch ohne CGLIB, also mit Java Proxys / Spring AOP)


    Ich habe irgendwie das Gefühl, dass ich eine Kleinigkeit vergessen habe. Insbesondere weil es mit Spring AOP und den Interface-Proxies ja funktioniert, dürfte die Konfiguration ja nicht all zu falsch sein.


    Leider komme ich an dieser Stelle nicht mehr weiter - über Eure Hilfe würde ich mich wirklich sehr freuen


    Vielen Dank!
     

  2. #2
    DarthShader DarthShader ist offline Mitglied Platin
    Registriert seit
    May 2004
    Beiträge
    684
    Hallo nochmal,

    hat keiner eine Idee? Ich komme an dieser Stelle nicht weiter. Ist ne dumme Situation, wenn man keine Fehlermeldung erhält und nix...

    Ich bin für jeden Tipp dankbar!
     

  3. #3
    pizza1234 pizza1234 ist offline Mitglied Gold
    Registriert seit
    Jan 2007
    Beiträge
    177
    Hi,
    ich hatte mal ein ähnliches Problem, vielleicht helfen dir ja die Erkenntnisse aus dem Beitrag weiter?
    http://www.tutorials.de/enterprise-j...ufgerufen.html

    Grüße
    Peter
     

Ähnliche Themen

  1. Funktion wird nicht aufgerufen
    Von blck im Forum Javascript & Ajax
    Antworten: 4
    Letzter Beitrag: 10.09.09, 16:29
  2. Spring & AspectJ:Methode wird nicht aufgerufen
    Von pizza1234 im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 18
    Letzter Beitrag: 12.05.09, 18:21
  3. paint wird nicht aufgerufen
    Von xmoO im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 25.04.09, 10:01
  4. Spring Dynamic Modules (OSGi) und AspectJ
    Von Thomas Darimont im Forum Java
    Antworten: 4
    Letzter Beitrag: 08.04.08, 18:13
  5. php-Script wird nicht aufgerufen
    Von kesnw im Forum PHP
    Antworten: 1
    Letzter Beitrag: 31.03.04, 01:49