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)
Comments
-
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 over 13 yearsOk now Im getting it, but it returns odd parameters. org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper@8c666a org.springframework.security.web.context.HttpSessionSecurityContextRepository$SaveToSessionResponseWrapper@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 over 13 yearsThose 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 over 13 yearsHow can I get static parameter values, in this case HttpServletRequest object ?
-
Sean Patrick Floyd over 13 yearsI 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.