2009-06-10 12 views
8

この質問に対する回答は、SpringフォーラムとStackOverflowを検索して見つけようとしました。私は恐ろしいアーキテクチャを記述し、私と同じことを求めているページがたくさんあることを知っていましたが、私の意図する使い方が違うので、私と一緒にご負担ください:-)注釈付きでSpring 2.5のAOPアドバイスからHttpServletRequestにアクセス

私は注釈ベースのフォームコントローラ基本的にはこのように:この中

@RequestMapping("/edit/someObject") 
public String handleSubmit(HttpServletRequest request, HttpServletResponse response, SomeObject someObject, BindingResult result) { 

    // Some check here 

    if(result.hasErrors()) { 
     return "form"; 
    } else { 
     SomeObjectService.update(someObject); 
     return "redirect:/view/someObject"; 
    } 
} 

私はHttpServletRequestの中で、いくつかのHTTPプロパティをチェックして、このプロパティが特定の値を持っている場合は、リダイレクトを送信するためのHttpServletResponseを使用しています。このチェックは、このアプリケーションのフォームコントローラの多く(ただしすべてではない)で行われます。私がしたいのは、このチェックを行い、コントローラからHttpServletRequestとHttpServletResponseパラメータをドロップするために、AOPのアドバイスによって処理される@CheckedSubmitアノテーションを作成することです。

私の問題は、この2つの(未使用の)パラメータを注釈付きメソッドに使用せずに、このAOPアドバイスから現在のHttpServletRequestとHttpServletResponseにアクセスする方法がわかりません。

要約:@RequestMappingアノテートメソッドでAOPアドバイスからHttpServletRequest/Responseにアクセスするにはどうすればよいですか?

答えて

12

2つの溶液(完全に)

解決方法1:アスペクトクラス内の(おそらく春:アドバイス(> =春2.0必要)

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder 
     .getRequestAttributes()).getRequest(); 

ソリューション2の内部3.0内のシエルトンビーンズが必要です!)

@Autowired(required=true) 
private HttpServletRequest request; 
+0

@Configurableが使用されているときに、Springによってインスタンス化されていないオブジェクトに対しては、ソリューション2が機能するという追加コメントがあります(AspectJが必要です) – Tomas

3

私はこれをすでに知っていると思うかもしれませんが、Spring MVSでこれを行うのは "公式"でしたが、HandlerInterceptorsを使用しています。アノテーション駆動型ではありませんが、HTTP制御フローに挿入され、要求と応答に完全にアクセスできます。要約のためではなく、あなたの全体の問題のため

+0

はい、私はこれを知っています。私の問題は、これはメソッドごとにわずかに構成可能でなければならないということです。注釈は、その余分なパラメータを処理する非常に簡単な方法を可能にするため、これには理想的です。 – Tomas

+0

ええ、私はそれが制限的であることがわかります。別のオプションは、おそらくAnnotationMethodHandlerAdapterをサブクラス化してHandlerAdapterの独自の実装を記述することです。私はこれを自分でやったことはありませんが、それはあなたに必要なものをする柔軟性を与えるかもしれません。 – skaffman

関連する問題