2010-11-18 5 views
3

Also habe ich angefangen, mit AspectJ zu arbeiten, um Verarbeitungsereignisse zu behandeln, wenn sich der Zustand eines Objekts in meiner Domäne ändert.Neuling, der mit AspectJ arbeitet: Ich kann den Aspekt nicht aufrufen

Effektiv möchte ich einen Ratschlag schreiben, der alle Setter-Methoden in meiner Domäne umschließt. Wenn der Advice aufgerufen wird, überprüft er den Anfangswert des eingestellten Feldes, führt den Setter aus und überprüft den Wert, nachdem der Setter ausgeführt wurde. Wenn sich der Wert ändert, löst er ein Ereignis für einen Ereignis-Listener aus und informiert über die Änderung.

Ich habe das Tutorial hier gefunden: http://www.andrewewhite.net/wordpress/2010/03/17/aspectj-annotation-tutorial/, aber ich bin nicht in der Lage, irgendwelche Ratschläge zu erhalten. Beachten Sie, dass ich nur die LTW-Methode zum Verflechten meiner Empfehlung verwende, ich schreibe keinen Rat mit der AspectJ-Sprache und vorkompiliere sie.

Mein aop.xml (in META-INF für meine Testsuite) sieht wie folgt aus:

<aspectj> 
    <aspects> 
     <aspect name="domain.aop.TestAspect"/> 
    </aspects> 
</aspectj> 

Die Aspect-Klasse, die ich wie folgt aussieht erstellt haben:

package domain.aop; 

import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 

@Aspect 
public class TestAspect 
{ 
    @Around("call(* domain.*.set*(..))") 
    public void aroundSetMethods (JoinPoint jp) 
    { 
     System.out.println ("aroundSetMethod called"); 
    } 
} 

Wenn Ich führe meinen Testfall aus, ich kann sehen (durch Setzen eines Haltepunkts), dass eine Methode (domain.Error.setTask()) aufgerufen wird. Es ist meine Überzeugung, dass dies meinen Ratschlag auslösen sollte, aber ich komme nie in die Beratungsmethode.

Irgendwelche Hinweise darauf, was ich hier falsch mache?

Danke

Antwort

3

Sie müssen auch angeben, welche Klassen Sie weben möchten.

Versuchen Sie aop.xml Datei mit diesem zu ersetzen:

<!DOCTYPE aspectj PUBLIC 
     "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd"> 
<aspectj> 
    <weaver> 
     <!-- only weave classes in this package --> 
     <include within="domain.*" /> 
    </weaver> 
    <aspects> 
     <!-- use only this aspect for weaving --> 
     <aspect name="domain.aop.TestAspect"/> 
    </aspects> 
</aspectj> 

Wenn Sie Ihre Runtime-Server oder Java-Agenten richtig konfiguriert haben, können Sie auch das Weben in Ihrem Protokoll sehen.

Ich hoffe, es hilft!

+1

Das ist es. Ich hatte den Eindruck, dass die @Around Annotation ausreichend war, um den Weber zu bestimmen, welche Klassen instrumentiert werden sollten. Anscheinend gab es nur ein bisschen mehr Konfiguration zu tun. Vielen Dank... – Steve