2015-09-03 14 views
7

E 'possibile modificare il valore argomento metodo su base di qualche controllo prima di eseguire utilizzando Spring AOPSpring AOP modificare il valore di argomento metodi su consiglio intorno

Il mio metodo

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

metodo Consigli

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

Si prega di suggerire il modo di impostare l'argomento metodo valore e poiché non ci sono opzioni setter per l'argomento.

risposta

3

ho avuto la mia risposta utilizzando 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(); 
} 
6

Sì, è possibile. Avete bisogno di un ProceedingJoinPoint invece di:

methodInvocation.proceed(); 

si può quindi chiamare procedere con nuovi argomenti, ad esempio:

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

vedere http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/aop.html#aop-ataspectj-advice-proceeding-with-the-call

+1

Basta fare attenzione: queste cose vengono saltate facilmente durante il ref principio di partecipazione. Se non hai una bella suite di test può far male. –

+0

Sì, assolutamente! Gli argomenti devono combaciare e gli strumenti di refactoring non aiuteranno in questi casi. – reto

+0

Ma ho usato l'interfaccia MethodInterceptor. Quali modifiche devo apportare per ProceedingJoinPoint –