web-dev-qa-db-ja.com

アドバイスの周りのメソッド引数の春のAOP変更値

Spring AOPを使用して実行する前に、いくつかのチェックに基づいてメソッド引数値を変更することは可能ですか?

私の方法

public String doSomething(final String someText, final boolean doTask) {
    // Some Content
    return "Some Text";
}

アドバイス方法

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();
}

引数にはセッターオプションがないので、メソッドの引数値を設定する方法を教えてください。

12
Ashish Aggarwal

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();
}
3
Ashish Aggarwal

はい、それは可能です。 ProceedingJoinPoint が必要で、代わりに:

methodInvocation.proceed();

次に、次のように、新しい引数を使用してproceedを呼び出すことができます。

methodInvocation.proceed(new Object[] {content, false});

http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/aop.html#aop-ataspectj-advice-proceeding-with-the-call を参照してください。 ==

8
reto

Spring AOPを使用し、@Aroundを使用してポイントカットを作成できます。次に、以下のコードを使用して、条件に基づいてメソッドの引数を変更できます。

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.
0
Subin Chalil