How can I access methods attributes with Spring AOP (AspectJ-style)?

19,019

Solution 1

You can get them from the ProceedingJoinPoint object:

@Around("anyPublicMethod() && @annotation(myAnnotation )")
public Object myAspect(final ProceedingJoinPoint pjp,
    final MyAnnotation myAnnotation) throws Throwable{

    // retrieve the methods parameter types (static):
    final Signature signature = pjp.getStaticPart().getSignature();
    if(signature instanceof MethodSignature){
        final MethodSignature ms = (MethodSignature) signature;
        final Class<?>[] parameterTypes = ms.getParameterTypes();
        for(final Class<?> pt : parameterTypes){
            System.out.println("Parameter type:" + pt);
        }
    }

    // retrieve the runtime method arguments (dynamic)
    for(final Object argument : pjp.getArgs()){
        System.out.println("Parameter value:" + argument);
    }

    return pjp.proceed();
}

Solution 2

ProceedingJoinPoint has pjp.getArgs(), which returns all the parameters of the method.

(but these are called parameters / arguments, not attributes)

Share:
19,019
newbie
Author by

newbie

Java developer

Updated on June 04, 2022

Comments

  • newbie
    newbie almost 2 years

    I need to intrecept some methods and their attributes by using annotations as point cuts, but how can I access those method attributes. I have following code that succesfully can run code before method is run, but I just don't know how I can access those attrbiutes.

    package my.package;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    
    @Aspect
    public class MyAspect {
    
     @Pointcut(value="execution(public * *(..))")
     public void anyPublicMethod() {
     }
    
     @Around("anyPublicMethod() && @annotation(myAnnotation )")
     public Object myAspect(ProceedingJoinPoint pjp, MyAnnotation myAnnotation)
        throws Throwable {
    
      // how can I access method attributes here ?
      System.out.println("hello aspect!");
      return pjp.proceed();
     }
    }
    
  • newbie
    newbie over 13 years
    Ok now Im getting it, but it returns odd parameters. org.springframework.security.web.servletapi.SecurityContextH‌​olderAwareRequestWra‌​pper@8c666a org.springframework.security.web.context.HttpSessionSecurity‌​ContextRepository$Sa‌​veToSessionResponseW‌​rapper@197d20c . My method is Spring controller with @RequestMapping and my own annotation. Why its giving me some Spring Security objects here when it should give HttpServletRequest object as params?
  • Sean Patrick Floyd
    Sean Patrick Floyd over 13 years
    Those are spring proxies around the original http request objects. See my updated answer: you can get both the defined parameter types (static analysis) and the actual runtime arguments (dynamic analysis)
  • newbie
    newbie over 13 years
    How can I get static parameter values, in this case HttpServletRequest object ?
  • Sean Patrick Floyd
    Sean Patrick Floyd over 13 years
    I showed you how to get the static type in my updated answer. But I don't think that's what you mean. Don't worry: SecurityContextHolderAwareRequestWrapper is actually a HttpServletRequest implementation (see static.springsource.org/spring-security/site/apidocs/org/…) that delegates functionality to the original request underneath.