[英]Spring AOP change value of methods argument on around advice
Is it possible to change method argument value on basis of some check before executing using Spring AOP是否可以在使用 Spring AOP 执行之前根据一些检查更改方法参数值
My method我的方法
public String doSomething(final String someText, final boolean doTask) {
// Some Content
return "Some Text";
}
Advice method咨询方法
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")) {
// Set my second argument as false
} else {
// Set my second argument as true
}
}
}
return methodInvocation.proceed();
}
Please suggest me the way to set the method argument value as there is no setter options for the argument.请建议我设置方法参数值的方法,因为该参数没有设置器选项。
Yes that's possible.是的,这是可能的。 You need a
ProceedingJoinPoint
and instead of:您需要一个
ProceedingJoinPoint
而不是:
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见http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/aop.html#aop-ataspectj-advice-proceeding-with-the-call
I got my answer using MethodInvocation
我使用
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
.您可以使用 Spring AOP,使用
@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.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.