2017-01-14 6 views
0

注釈値を取得し、 はここに私の注釈である春AOPは、私は、注釈から値を取得することができますどのように、私は春のAOPを使用しています

<aop:aspectj-autoproxy/> 
    <aop:config> 
     <aop:aspect ref="methodProfiler"> 
      <aop:pointcut id="serviceMethod" 
       expression="(execution(* com.old..*(..)) or execution(* com.test..*(..))) and @annotation(com.test.profiler.ExecutionMethodProfiler)" /> 
      <aop:around pointcut-ref="serviceMethod" method="profile"/> 
     </aop:aspect> 
    </aop:config> 

そして、これはあります私serviceMethod:

public void profile(ProceedingJoinPoint jointPoint) throws Throwable {} 

が今のように私はこのコードを使用して値を取得することができます:

MethodSignature signature = (MethodSignature) jointPoint.getSignature(); 
System.out.println(signature.getMethod().getAnnotation(ExecutionMethodProfiler.class).value()); 

私はそれが好きではありません、より良い方法はありますか?

答えて

0

まず、追加の引数として、あなたの注釈を取るためにあなたのアドバイスを変更します。

public void profile(
    ProceedingJoinPoint jointPoint, 
    ExecutionMethodProfiler methodProfiler 
) throws Throwable {} 

次に、あなたのポイントカットにその引数に注釈をバインド:

<aop:around 
    pointcut="(execution(* com.old..*(..)) or execution(* com.test..*(..))) and @annotation(methodProfiler)" 
    method="profile" 
    arg-names="methodProfiler" 
/> 

私ので、私は実際にそれをテストしていません今は少し忙しいですが、これは基本的にどのように動作するのですか?

+0

私はそれをしよう、と私はエラーを取得しています: ネストされた例外は、java.lang.IllegalArgumentExceptionがある:ポイントカット – Breakidi

+0

で結合していない:: 0でエラーが正式な最初のメソッドシグネチャにジョインポイントのパラメータを持つように私は私の答えを更新しました。 AspectJでは最初または最後のパラメータにすることができますが、おそらくSpringはここでもっと厄介です。さらに、パラメータ名がどこでも同じであることを確認してください:pointcut、arg-names、およびmethod signature。さもなければそれは縛られることができない。 – kriegaex

+0

メソッドのシグネチャを細く更新すると、この例外が発生します。 コンストラクターが例外をスローしました。ネストされた例外はjava.lang.IllegalStateExceptionです:アドバイスで名前でバインドする2つの引数を見つけることが予想されますが、実際には1つの引数が見つかりました。 – Breakidi

関連する問題