2013-10-09 14 views
7

私はコントローラメソッドについてAOPアドバイスを書く標準的な方法を知っていますし、コントローラメソッドで宣言されていればHttpServletRequest argにアクセスすることができます。HttpServletRequestをSpring AOPリクエストに挿入するには(カスタムシナリオ)?

私のシナリオでは、翻訳サービスがあり、現在はセッションスコープで翻訳のためにユーザーのロケールを維持しています。私はこれがサービスをステートフルにしていると感じています。そして、私はそれが本当にシングルトンだと思うので、セッションスコープにしたくありません。しかし、翻訳サービスメソッドが呼び出される場所は複数あります。したがって、これらのメソッドでは、署名を変更してリクエスト/ロケールを追加する必要はありません。問題は、翻訳サービスのメソッドの呼び出し側すべてがHttpServletRequest(コントローラメソッドではない)にアクセスできないことです。翻訳サービスメソッドについての面を書くことができ、呼び出し元のコンテキストで使用できるかどうかにかかわらず、何とかHttpServletRequestに魔法のようにアクセスできますか?

@Service 
public class TranslationService { 
    public void translate(String key) { 
     ... 
    } 
} 

@Aspect 
@Component 
public class LocaleFinder { 
    @PointCut("execution(* TranslationService.translate(..))") 
    private void fetchLocale() {} 

    @Around("fetchLocale()") // in parameter list 
    public void advice(JoinPoint joinpoint, HttpServletRequest request) { .... } 
} 

今、変換の呼び出し側がHttpServletRequestのを持っていない場合、私はアドバイスに要求を得ることができませんか?回避策はありますか?

答えて

28

は、私はそれが呼び出し元のコンテキストで使用できるかどうかにかかわらず、 のHttpServletRequestのへの翻訳サービスメソッドの周りの側面と 何とか魔法の取得書き込みアクセスをすることはできますか?

容易ではありません。実際、多くの努力が必要です。

簡単な方法はRequestContextHolderに依存することです。すべてのリクエストにおいて、DispatcherServletは、現在のHttpServletRequestRequestContextHolderstatic ThreadLocalオブジェクトにバインドします。あなたは

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

と同じThread内で実行するときは、advice()方法でこれを行うことができ、したがって、パラメータを宣言する必要はありません、それを取得することができます。

関連する問題