2016-07-20 37 views
0

主な質問 - メソッドのパラメータがエラーになると、Spring AOPを使用してメソッドのパラメータを記録したいそのメソッドの実行時に例外が発生し、その例外が呼び出し側のメソッドにスローされます。Spring AOP @AfterThrowing - メソッドの詳細を呼び出すメソッドの呼び出し(メソッドを呼び出さない)

私は上記を行うことはできますか? @AfterThrowingのように、呼び出されたメソッドの詳細は記録されますが、呼び出されたメソッド(エラーが実際に発生した場所)は記録されません。

これは私が持っているものである -

テックスタック -

  1. 春ブーツ1.3.5

マイ@Aspectクラス -

@Aspect 
@Component 
public class LoggingAspect { 
@AfterThrowing(pointcut = "execution(* com.spicedcider.service..*.*(..))", throwing = "e") 
public void logExceptionContext(JoinPoint joinPoint, Throwable e) { 
    Object[] params = joinPoint.getArgs(); 

    log.error("Exception while executing method below - "); 
    log.error("[" + joinPoint.getStaticPart().getSignature() + "]"); 
    log.error("Exception message - " + e.getMessage()); 
    log.error("Full stack trace logged further below"); 

    log.error("Params for this method - "); 
    for (Object object : params) { 
     log.error(object == null ? "[is null]" : object.toString()); 
    } 
} 

上記うまく動作します - フローが以下のようになると、

メイン呼び出し方法

public void executeBusinessLogic(String var1, String var2) { 
    /* some activities */ 
    String myName = "Spiced Cider"; 
    returnObject = anotherService.executeSubLogic(myName); 

    /* more activities based on returnObject */ 
} 

支える今の方法

public Object executeSubLogic(String name) { 
    /* an exception occurs here and is thrown to executeBusinessLogic() */ 
} 

は、AOPは、以下のようにこれを記録します。実際にエラーが発生した場所 - それは「と呼ばれる方法」対「呼び出し方法」と関連する項目をログに記録されて見ることができるように

[ERROR] [..LoggingAspect.logExceptionContext] - Exception while executing method below - 
[ERROR] [..LoggingAspect.logExceptionContext] - [void executeBusinessLogic()] 
[ERROR] [..LoggingAspect.logExceptionContext] - Exception message - <message> 
[ERROR] [..LoggingAspect.logExceptionContext] - Full stack trace logged further below 
[ERROR] [..LoggingAspect.logExceptionContext] - Params for this method - 
[ERROR] [..LoggingAspect.logExceptionContext] - <var1 value> 
[ERROR] [..LoggingAspect.logExceptionContext] - <var2 value> 

私がこれを必要とする理由 - これはデバッグの観点からのものです。例外が発生すると、例外が発生したメソッドに渡されたパラメータを知る必要があります。

  1. 今、私はAOPを使用して、すべてのメソッドエントリとのparamsを記録することができます - - 私は、ログ/パフォーマンスを乱雑にしたくない - があった場合にのみ、のparamsを知ることが必要とされていると考え

    のAlternates例外。

  2. 私はもちろんtry/catchブロックを使ってすべてのメソッドにこれを記録することができますが、それは定型コードをたくさん繰り返さなければならないということです。

私は、AOPを動作させる方法についての詳細があるが、上記の質問/議論を見つけることができなかった多くのフォーラムを検索した。これは私が見つけることができる他の唯一の投稿です - しかし、この質問に対する答えではありません - Spring AOP with groovy: get called method

私が探しているものができるかどうか私に教えてください/ ifこれは、これを行う正しい(または効率的な)方法でさえあります。ありがとうございました !

答えて

0

すべてが正しく実装されている場合、ログ出力が複数回表示されることが予想されます.1回の呼び出しで、呼び出しスタックのエラーをスローするSpringコンポーネント内の非静的メソッドです。これは本当にあなたが望むものですか?同じ例外が複数回記録されましたか?とにかく、あなたはまさにそれを望んでいるようです。

いくつかの説明が観察された行動のために頭に浮かぶ:

  • 方法executeSubLogic(..)を宣言するクラスがのSpring Bean /コンポーネントではありません。 AOPフレームワークは、本格的なAspectJではなく、Spring AOPを使用するように見えるため、Springコンポーネントのパブリックメソッドをインターセプトすることしかできません。
  • メソッドを宣言するクラスexecuteSubLogic(..)はSpring Bean /コンポーネントですが、インターフェイスは実装されていません。クラス(インターフェースではない)用の動的プロキシを作成するために、SpringにはCGLIBが必要ですが、何らかの理由でlibがクラスパス上に存在しません。
  • あなたのpointcutは、パッケージcom.spicedcider.serviceを含むすべてのメソッドの実行をキャッチします。そのパッケージ内のクラスはではなく、です。
+0

こんにちはkriegaex - 詳細をありがとうございます。私は上記のケース2です - executeSubLogic(...)を持つクラスは抽象基本クラスであり、インターフェイスを実装しません。私はそれを変えることができるかどうか確認するつもりです。 –

関連する問題