2013-10-09 10 views
7

Znam standardowy sposób pisania porady AOP wokół metody kontrolera i że można uzyskać dostęp do argumentu HttpServletRequest, jeśli zadeklarowano w metodzie sterownika.Jak wprowadzić HttpServletRequest do żądania Spring AOP (niestandardowy scenariusz)?

Ale moim scenariuszem jest to, że mam usługę tłumaczenia, która obecnie ma zasięg sesji, zachowując lokalizację użytkownika dla tłumaczenia. Uważam, że to sprawia, że ​​usługa jest pełna, a także, że nie chcę, aby była ona dostępna w sesjach, ponieważ myślę, że to naprawdę Singleton. Ale istnieje wiele miejsc, w których wywoływane są metody usług tłumaczeniowych, więc nie chcę zmieniać podpisu, aby dodać żądanie/ustawienia regionalne w tych metodach. Problem polega na tym, że wszyscy wywołujący metody usługi tłumaczenia nie mają dostępu do HttpServletRequest (nie metody kontrolera)? Czy mogę napisać jakiś aspekt dotyczący metod usług tłumaczeniowych i jakoś magicznie uzyskać dostęp do HttpServletRequest, niezależnie od tego, czy jest on dostępny w kontekście dzwoniącego czy nie?

@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) { .... } 
} 

Jeśli teraz rozmówca tłumaczący nie ma HttpServletRequest, czy nie mogę uzyskać prośby o poradę? Czy jest w pobliżu praca?

Odpowiedz

28

mogę napisać aspekt wokół metod usług tłumaczeniowych i jakoś magicznie uzyskać dostęp do HttpServletRequest niezależnie od czy jest dostępny w kontekście rozmówcy czy nie?

Niełatwo. W rzeczywistości wymagałoby to wiele wysiłku.

Łatwym sposobem na to jest poleganie na RequestContextHolder. W każdym żądaniu DispatcherServlet wiąże bieżący obiekt HttpServletRequest z obiektem static ThreadLocal w urządzeniu RequestContextHolder. Można pobrać go podczas wykonywania w tym samym Thread z

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

Można to zrobić w metodzie advice() i dlatego nie trzeba zadeklarować parametr.

Powiązane problemy