2012-01-14 13 views
6

Iは、ターゲットメソッドの詳細に基づいて各種の演算を行う態様を有しており、次のように、したがって、これらの先行を抽出する。抽出された内容のAspectJのMethodSignature()

@Around("execution(* com.xyz.service.AccountService.*(..))") 
public void validateParams(ProceedingJoinPoint joinPoint) throws Throwable { 
    final MethodSignature signature = (MethodSignature) joinPoint.getSignature(); 

    final String methodName = signature.getName(); 
    final String[] parameterNames = signature.getParameterNames(); 
    final Object[] arguments = joinPoint.getArgs(); 
    ... 
    ... 
    ... 
    joinPoint.proceed(); 
} 

を、すべての予想を反映常にnullを返すparameterNames以外の情報私はそれが以下の署名に従って{accountDetails}を返すと期待します。誰かが私が逃しているかもしれないことを知っているだろうか、これはバグですか?

ここで私が不利に働いていますターゲットメソッドのシグネチャです:私はvalidateParamsの署名を変更したparamName: accountDetails

:私のために

Long createAccount(RequestAccountDetails accountDetails); 
+1

見た目から、パラメータ名を取得する信頼できる方法はありません(コンパイル時に設定されたオプションに依存しません)。 「Javaリフレクションを使用してメソッドパラメータ名を取得することはできますか?」(http://stackoverflow.com/questions/2237803/can-i-obtain-method-parameter-name-using-java-reflection)と[方法はありますかJavaのメソッドパラメータの名前を取得する](http://stackoverflow.com/questions/381502/is-there-a-way-to-obtain-names-of-method-parameters-in-java)を参照してください。だから、私はこれがここにあるのかもしれないと思う。 –

答えて

1

作品:

@Aspect 
public class MyAspect { 

    @Around("execution(* *(..)) && !within(MyAspect)") 
    public Object validateParams(ProceedingJoinPoint joinPoint) throws Throwable { 
     final MethodSignature signature = (MethodSignature) joinPoint.getSignature(); 

     final String[] parameterNames = signature.getParameterNames(); 
     for (String string : parameterNames) { 
      System.out.println("paramName: " + string); 
     } 

     return joinPoint.proceed(); 

    } 
} 

の出力は: はLongを返すため、 public Object validateParams(ProceedingJoinPoint joinPoint) throws Throwableです。それ以外の場合は、エラーが発生します。applying to join point that doesnt return void: {0}

+1

ありがとうフレッド!私の分析から、paramNamesが利用可能な特定の環境/ JVM設定があるように見えますが、今のところ戻ってきており、特定の詳細を思い出すことはできません。戻り値を指摘してくれてありがとう、私は自分のコードからの質問に適応し、いくつかのビットを残している可能性があります。 –