2017-03-27 19 views
0

サービス呼び出し時にすべてのメソッドを記録する際に問題があります。コードは次のようである:AOPのすべてのメソッドpublicメソッド呼び出しを記録する方法

package com.myproject.controller; 
@RestController(/person) 
public class Controller{ 
    public Person getpersonInfo(){ 
    ...... 
    getValidPerson(); 
    } 
} 

public Person getValidPerson() { 

    isPersonValid(Person person); 
    .... 
} 

Personクラスのメソッド:

package com.myproject.dao; 
public class Dao{ 
    public boolean isPersonValid(){ 
    //Checks for the person is Valid 
    } 
} 

アスペクトクラス:

package com.myproject; 
@Component 
@Aspect 
public class Logging{ 

    @Before("execution(* com.myproject..*.*(..)))") 
    public void beforeServiceCall(Jointpoint jp) { 
    //Some Logging function 
    } 

} 

この

package com.myproject; 
@SpringBootApplication 
@EnableAutoConfiguration 
@EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.ENABLED) 
@EnableAspectJAutoProxy() 
public class Main implements LoadTimeWeavingConfigurer{ 
    public static void main(String[] args){ 
    ...... 
    } 
} 

ポンポンファイルなどのメインクラス:

 <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-aop</artifactId> 
      <version>4.3.7.RELEASE</version> 
     </dependency> 


     <dependency> 
      <groupId>org.aspectj</groupId> 
      <artifactId>aspectjrt</artifactId> 
      <version>1.8.1</version> 
     </dependency> 
     <!-- https://mvnrepository.com/artifact/org.springframework/spring-instrument --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-instrument</artifactId> 
     </dependency> 
     <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --> 
     <dependency> 
      <groupId>org.aspectj</groupId> 
      <artifactId>aspectjweaver</artifactId> 
      <version>1.8.1</version> 
     </dependency> 

私はサービスhttp://localhost:8080/person呼び出す - getpersonInfoを(GET)はこの場合のみに記録され、私は私がすべての内部メソッドをログに記録する必要も LTWを試してみましたが、

を解決しませんgetValidPerson()、isPersonValid()のようなサービスは、呼び出されたメソッドのすべての引数を示します。

+0

ログに記録されていないものは言及していませんが、それを期限切れにしています。さらに、スニペットには、アスペクトが正しいかどうかを確認するために必要な情報の重要な部分が欠落しています。パッケージ名、クラス宣言など。注釈。短い質問は良いですが、あまりにも短くはありません。しかし、私はすでにあなたに伝えることができます:単純なSpring AOPでは、完全なAspectJ LTWには '@ EnableLoadTimeWeaving'、単純なSpring AOPでは' @ EnableAspectJAutoProxy'を使うべきです。ところで、プライベートメソッドはSpring AOPで捕捉することはできませんが、あなたのコードにプライベートメソッドがないので、問題はありません。 – kriegaex

+0

動作しなかった '@ EnableAspectJAutoProxy'を削除しました。この問題を解決する他の方法をお勧めしますか? – Prabitha

+0

私の前のコメントを読み、要求された情報を提供してください。 – kriegaex

答えて

0

古典場合は、ここで答えおよそ378倍の前に:

  • 春AOPはプロキシベースであるため、この方法を傍受することはできませんthisが実際のオブジェクトであるので、(単にsomeMethod()に相当)this.someMethod()のように呼び出しますプロキシではありません。プロキシの使用は、Spring AOPの代行受信を意味しません。これは十分に文書化されている。 Spring AOPマニュアルでは、「self-invocation」という用語を探します。
  • 内部メソッド呼び出しをインターセプトする場合は、Spring AOPではなく、AspectJをLTWで使用してください。プロキシを使用する必要はありません。プロキシを正しく使用するだけで動作します。 SpringのマニュアルのChapter 11.8では、その方法を説明しています。

いくつかの発言:

  • あなたは本当にツールを使用する前に取扱説明書をお読みください。
  • StackOverflowで新しい質問を作成する前に、既存の質問を検索する必要があります。
  • 最初に、パブリックメソッドとプライベートメソッドをインターセプトする方法について質問しました。その後、主題と質問そのものを編集しました。それは、それが公共対個人ではなく自己呼び出しについてのものではないことが明らかになりました。これはまったく別の話題です。私はそれを実際にやってうれしくないことを知っています。
  • たぶん、あなたはそれがaspectjweaverのサブセットであるため、あなたはaspectjrtを必要としないのJava 8
  • に関してバグフィックスと小さな改善の多くが含まれている1.8.1から1.8.10にごaspectjweaver依存関係をアップグレードしたいです。前者はコンパイル時の織りには役に立ちますが、ロード時の織りには役に立ちません。
関連する問題