简体   繁体   English

Spring AOP 更改环绕通知上方法参数的值

[英]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-callhttp://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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM