Sto avendo un po 'di problemi a capire come creare un collegamento di punti che opererà su bean che hanno uno specifico parametro annotato. Il mio obiettivo finale è quello di convalidare il valore del parametro prima che venga elaborato, ma per il momento ho solo bisogno di creare il pointcut.Come scrivere un pointcut di Aspect basato su un parametro annotato
Si consideri la seguente annotazione
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.PARAMETER })
public @interface MyAnnotation {}
ho poi volessi applicare questo ad un certo numero di metodi come:
public void method1(@MyAnnotation long i) {}
public void method2(String someThing, @MyAnnotation long i) {}
public void method3(String someThing, @MyAnnotation long i, byte value) {}
Così
- non mi interessa che classe (o pacchetto) i metodi sono in
- La posizione dell'annotazione l'argomento sarà diverso.
- so che il valore annotato si applica solo a un tipo specifico
mia implementazione pointcut deve essere qualcosa lungo le linee di:
@Before(value = "* *(..) && args(verifyMe)")
public void verifyInvestigationId(long verifyMe) {}
mi sto un po 'confuso su esattamente ciò che deve essere il valore @Before
e come legare l'annotazione e il suo tipo. A questo punto probabilmente non vale la pena elencare le cose che ho provato!
Aggiornamento: Sulla base del parere che ho visto in http://stackoverflow.com/questions/3565718/pointcut-matching-methods-with-annotated-parameters/3567170#3567170 (e correggere un paio di incomprensioni e l'aggiunta di spazio ho trascurato) ho al punto in cui le seguenti opere:
@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");
}
questo è quasi quello che mi serve - tutto quello che dovete fare è passare il valore dell'argomento annotato come parametro per il metodo. Non riesco a capire la sintassi per fare in modo che Spring lo faccia (la risposta collegata non mostra questo).
possibile duplicato del [corrispondenti metodi pointcut con parametri annotati] (http://stackoverflow.com/questions/2766844/pointcut-matching-methods-with-annotated-parameters) – sheltem
@sheltem, Grazie per avermi indicato che questo. Purtroppo questa è stata una delle cose che ho provato, ma fallita. I log contenevano l'errore: Pointcut non è ben formato: aspettando 'nome pattern' all'esecuzione del personaggio 56 esecuzione (pubblico * * (.., @ aspetti.VerifyMe (*), ..)) – Stormcloud
BTW: ci sono due stelle separate da uno spazio dopo la parola "pubblico" - StackOverflow le ha interpretate come in corsivo! – Stormcloud