2011-07-12 15 views
1

私のメソッドの元の行番号をAspectJ(Spring)フレームワークで記録するにはどうしたらいいですか?私はプログラミングを初めてお使いになっているので、可能かどうかを知りたいだけです。 aopは新しいクラスと新しいメソッドを生成するmyメソッドの呼び出しプロセスを委譲するので、ログに記録される行番号は常に元のものではありません。AspectJとlog4jを使ってログ行番号を元に戻す方法は?

は、以下の私のコードの一部を以下のとおりです。

スキーマベースのAOPの設定:ここでは

<bean id="logInterceptor" class="com.fuhu.appsub.aop.LogInterceptor"></bean> 
<aop:config> 
    <aop:aspect id="logDBAspect" ref="logInterceptor"> 
    <aop:pointcut id="logDBPointcut" expression="execution(*   com.fuhu.appsub.service..*(..)) " /> 
     <aop:after-throwing pointcut-ref="logDBPointcut" throwing="ex" method="logDBException"/>   
    </aop:aspect> 
</aop:config> 

だ私の委任方法:

public void logDBException(JoinPoint joinPoint, Exception ex) { 
     if(loggerDB.isErrorEnabled()){ 
      loggerDB.error(ex.getMessage()); 
     } 
    } 

@Transactional(propagation=Propagation.REQUIRED, readOnly=true) 
public List<Item> findByName (String name) throws Exception{ 
    try 
    { 
     List<Item> itemList = itemRepository.findByName(name); 
     int i=0,j=1; 
     int k = j/i; 
     return itemList; 
    } 
    catch(Exception ex) 
    { 
     throw new Exception(ex.getMessage() + "in findByName with name=" + name + " file:" + Thread.currentThread().getStackTrace()[2].getFileName() + " line:" + Thread.currentThread().getStackTrace()[2].getLineNumber()); 
    } 
} 

はここに私の委譲メソッドです

答えて

1

full AspectJ or just Spring's AOPを使用していますか? Spring AOP is primarily based on Java dynamic proxies通常は必要な処理を行うだけで十分ですが、それはかなり簡単ですし、スタックトレースライン番号にはまったく干渉しません。

+0

明らかに、私はあなたの質問が完了する前にそれを読んでいます。 Spring AOPを使用しているので、正確な行番号を取得する必要があります。しかし、私はThread.getStackTraceを一度も使用していないので、おそらくあなたはそれからいくつかの特殊な動作を得ているでしょう。 例外をキャッチすることは、例外を投げているように、非常に貧しい習慣です。スローされた例外には独自のstacktraceがあり、logDBExceptionメソッドは例外メッセージに組み込むのではなく必要な情報を簡単に抽出できることにも注意してください。 –

+0

ちょっとライアン、私はあなたが言ったことに取り組んだ、本当にありがとう。 – post2626

1

実際のAspectJでも元のコードの行番号は変更されません。

これは、クラスファイルの行番号が行番号テーブルに格納されているためです。そして、このテーブルは1つの "行"に複数のステートメントを持つことができます。したがって、追加のAOP呼び出しでも行番号を変更してはいけません。

+0

Sonarのようなものを使用している場合、コードスタイルでは複数のステートメントを1行にまとめることはできません。 – djangofan

関連する問題