java - AspectJ - Pointcut at specified method with a param annotated with class level annotation -


in aspect, i'd stop @ specified method. method has 1 parameter annotated class level annotation:

the annotation is:

@retention(retentionpolicy.runtime)   @target(elementtype.type)   public @interface auditable {}   

the parameter object of class annotated like:

@auditable   public class user {}   

the method inspect:

public object findsingleresultbyexample(final object entity) {}   

this aspect not working:

@afterreturning(value="execution(* org.wtp.repository.genericdao.find*(@org.wtp.aspects.auditable (*)))",   argnames = "joinpoint, result",   returning = "result")   private void auditfindannotation(final joinpoint joinpoint, final object result) {}   

first of all, advice method must public, not private. please change into

public void auditfindannotation(...) 

it not working because pointcut intercepts methods @auditable parameter annotation. sample method not have such annotation, though. work if method signature this:

public object findsingleresultbyexample(final @auditable object entity) {} 

btw, @target(elementtype.type) restriction must removed or extended in order code still compile.

but guess want not match on parameter annotations, on type annotations. pointcut (no parentheses around * time):

execution(* org.wtp.repository.genericdao.find*(@org.wtp.aspects.auditable *)) 

but again, not match sample method because parameter type not user or auditable object , latter not carry annotation. can see difference if overload find* method , this:

package de.scrum_master.app;  import java.lang.annotation.retention; import java.lang.annotation.retentionpolicy;  @retention(retentionpolicy.runtime) public @interface auditable {} 
package de.scrum_master.app;  @auditable public class user {} 
package de.scrum_master.app;  import java.util.arraylist;  public class application {     public object findsingleresultbyexample(final object entity) {         return entity;     }      public object findsingleresultbyexample(final user entity) {         return entity;     }      public static void main(string[] args) {         application application = new application();         application.findsingleresultbyexample("foo");         application.findsingleresultbyexample(new user());         application.findsingleresultbyexample(new arraylist<string>());     } } 
package de.scrum_master.aspect;  import org.aspectj.lang.joinpoint; import org.aspectj.lang.annotation.afterreturning; import org.aspectj.lang.annotation.aspect;  @aspect public class auditaspect {     @afterreturning(         value = "execution(* de.scrum_master.app..find*(@de.scrum_master.app.auditable *))",         argnames = "thisjoinpoint, result",         returning = "result"     )     public void auditfindannotation(final joinpoint thisjoinpoint, final object result) {         system.out.println(thisjoinpoint + " -> " + result);     } } 

the console log looks this:

execution(object de.scrum_master.app.application.findsingleresultbyexample(user)) -> de.scrum_master.app.user@4a574795 

update: in order whole thing working without changing or overloading method signatures, have make pointcut match calls , dynamically determine type , annotations withing aspect via reflection (not nice, possible). feel free ask questions if not understand idea.


Comments

Popular posts from this blog

python - No exponential form of the z-axis in matplotlib-3D-plots -

php - Best Light server (Linux + Web server + Database) for Raspberry Pi -

c# - "Newtonsoft.Json.JsonSerializationException unable to find constructor to use for types" error when deserializing class -