Spring AOP change value of methods argument on around advice
I got my answer using MethodInvocation
public Object invoke(final MethodInvocation methodInvocation) throws Throwable {
String methodName = methodInvocation.getMethod().getName();
Object[] arguments = methodInvocation.getArguments();
if (arguments.length >= 2) {
if (arguments[0] instanceof String) {
String content = (String) arguments[0];
if(content.equalsIgnoreCase("A")) {
if (methodInvocation instanceof ReflectiveMethodInvocation) {
ReflectiveMethodInvocation invocation = (ReflectiveMethodInvocation) methodInvocation;
arguments[1] = false;
invocation.setArguments(arguments);
}
} else {
if (methodInvocation instanceof ReflectiveMethodInvocation) {
ReflectiveMethodInvocation invocation = (ReflectiveMethodInvocation) methodInvocation;
arguments[1] = true;
invocation.setArguments(arguments);
}
}
}
}
return methodInvocation.proceed();
}
You can use Spring AOP, create point cut using @Around
.
Then you can use the below code to change the arguments of the method, based on the condition.
int index = 0;
Object[] modifiedArgs = proceedingJoinPoint.getArgs();
for (Object arg : proceedingJoinPoint.getArgs()) {
if (arg instanceof User) { // Check on what basis argument have to be modified.
modifiedArgs[index]=user;
}
index++;
}
return proceedingJoinPoint.proceed(modifiedArgs); //Continue with the method with modified arguments.
Yes that's possible. You need a ProceedingJoinPoint
and instead of:
methodInvocation.proceed();
you can then call proceed with the new arguments, for example:
methodInvocation.proceed(new Object[] {content, false});
see http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/aop.html#aop-ataspectj-advice-proceeding-with-the-call