20

コントローラー メソッドに関する AOP アドバイスを記述する標準的な方法と、コントローラー メソッドで宣言されている場合は HttpServletRequest 引数にアクセスできることを知っています。

しかし、私のシナリオは、現在、翻訳のためにユーザーのロケールを維持するセッションスコープの翻訳サービスを持っているということです。これにより、サービスがステートフルになり、実際にはシングルトンだと思うので、セッションスコープにしたくありません。しかし、翻訳サービス メソッドが呼び出される場所は複数あるため、署名を変更してこれらのメソッドにリクエスト/ロケールを追加したくありません。問題は、翻訳サービスのメソッドのすべての呼び出し元が 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 を持っていない場合、アドバイスでリクエストを取得できませんか? 回避策はありますか?

4

2 に答える 2