2016-06-15 14 views
0

注釈付きSpring Controllerで要求と応答のJsonコンテンツを保存するライブラリを構築したいとします。注釈付きSpring Controllerで要求と応答のjsonコンテンツを取得する

だから私は、私自身の注釈@fooを構築し、いくつかのコントローラにそれを入れている:

@Foo 
    @RequestMapping(method = RequestMethod.POST, value = "/doSomeThing", produces = { 
      MediaType.APPLICATION_JSON_VALUE, MediaType.TEXT_XML_VALUE, 
      MediaType.APPLICATION_XML_VALUE}) 
    public ResponseEntity<T> doSomething(/*some parameters*/) { 
     T t = doSomeJob(T.class); 
     return new ResponseEntity<T>(t, HttpStatus.OK); 
} 

私は、要求と応答がContrellorのパラメータであることを保証はありません! そして、@AfterReturning AOPのポイントカット内にその注釈を持つコントローラの呼び出しをキャッチしています。

@Component 
@Aspect 
public class XYInterceptor 
@AfterReturning(
      pointcut = "execution(@my.annotation.Foo)") 
      public void doSomethingWithJsonContent(JoinPoint joinPoint) throws Throwable { 

      //How can i get json value of request and response here?  
} 

jsonでフォーマットされたリクエストおよびレスポンスのコンテンツ(クライアントに送信/返されるなど)を取得するにはどうすればよいですか。

あなたの助けを頼りにしてください!

答えて

0

まあ、注入されたクラスメンバ、メソッドパラメータ、またはメソッドの戻り値のいずれかによって、コントローラメソッドから何らかの方法でアクセスできる要求と応答が必要です。それはどこかでになるはずです。どこから取得するのか説明していないので、@AfterReturningアドバイスからメソッドの引数と戻り値を決定する方法を示す一般的な回答を投稿することができます。より詳細な情報で質問を更新する場合は、それに応じて回答を更新することもできます。

私のポイントカット(コメントアウトされたものもうまくいきます)は戻り値をパラメータにバインドし、要求と応答の両方がStringタイプであると仮定します。あなたの好きなもので置き換えても構いません。さらに、パラメータが存在し、その(スーパー)タイプも知っている場合は、インターセプトされたメソッド(シグネチャのどこにあっても)から型付きアドバイスメソッドのパラメータにパラメータをバインドできます。この方法で、getArgs()以上の遅くて醜いループを取り除くことができます。

//@AfterReturning(pointcut = "execution(@my.annotation.Foo * *(..))", returning = "response") 
@AfterReturning(pointcut = "@annotation(my.annotation.Foo)", returning = "response") 
public void interceptRequest(String response, JoinPoint thisJoinPoint) { 
    System.out.println(thisJoinPoint); 
    for (Object arg : thisJoinPoint.getArgs()) { 
     if (arg instanceof String) 
      System.out.println(" request = " + arg); 
    } 
    System.out.println(" response = " + response); 
} 
関連する問題