Ich habe ein bisschen Mühe herauszufinden, wie man einen Pointcut erstellt, der auf Beans funktioniert, die einen bestimmten annotierten Parameter haben. Mein Ziel ist es, den Wert des Parameters vor der Verarbeitung zu validieren, aber für den Moment muss ich nur den Pointcut erstellen.Wie schreibe ich einen Aspect Pointcut basierend auf einem annotierten Parameter
Betrachten Sie die folgende Anmerkung
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.PARAMETER })
public @interface MyAnnotation {}
ich dann diese wie auf eine Reihe von Methoden anwenden möchten:
public void method1(@MyAnnotation long i) {}
public void method2(String someThing, @MyAnnotation long i) {}
public void method3(String someThing, @MyAnnotation long i, byte value) {}
So
- ist mir egal, was Klasse (oder Paket) die Methoden sind in
- Die Position des Annotats ed Argument wird variieren.
- Ich weiß, dass kommentierte Wert wird nur
Meine pointcut Implementierung etwas entlang der Linien werden muss, um eine bestimmte Art gelten:
@Before(value = "* *(..) && args(verifyMe)")
public void verifyInvestigationId(long verifyMe) {}
Ich bin immer ein wenig verwirrt über genau das, was @Before
Wert sein muss und wie man die Annotation und ihren Typ bindet. An diesem Punkt ist es wahrscheinlich nicht wert, die Dinge aufzulisten, die ich ausprobiert habe!
aktualisieren: Basierend auf den Rat, den ich in http://stackoverflow.com/questions/3565718/pointcut-matching-methods-with-annotated-parameters/3567170#3567170 gesehen habe (und Korrektur ein paar Missverständnisse und das Hinzufügen von Raum, den ich übersehen) ich habe zu dem Punkt, wo die folgenden Werke:
@Before("execution(public * *(.., @full.path.to.MyAnnotation (*), ..))")
public void beforeMethod(JoinPoint joinPoint) {
System.out.println("At least one of the parameters are annotated with @MyAnnotation");
}
das ist fast, was ich brauche - alles, was ich tun müssen, um den Wert des kommentierten Argument als Parameter übergeben zu die Methode. Ich kann die Syntax nicht ganz ausarbeiten, um Spring dazu zu bringen (die verknüpfte Antwort zeigt das nicht).
mögliches Duplikat [Pointcut passende Methoden mit annotierten Parametern] (http://stackoverflow.com/questions/2766844/pointcut-matching-methods-with-annotated-Parameter) – sheltem
@sheltem, Danke, dass du mich darauf hingewiesen hast. Leider war das eines der Dinge, die ich ausprobiert habe, aber gescheitert ist. Die Protokolle enthalten den Fehler: Pointcut ist nicht wohlgeformt: Erwartung 'Namensmuster' an Zeichenposition 56 Ausführung (öffentlich * * (.., @ aspects.VerifyMe (*), ..)) – Stormcloud
BTW: Es gibt zwei Sterne getrennt durch ein Leerzeichen nach dem Wort "public" - stackoverflow hat sie als kursiv interpretiert! – Stormcloud