2013-10-09 15 views
7

Denetleyici yönteminde bir AOP önerisi yazmanın standart yöntemini biliyorum ve denetleyici yönteminde bildirilmişse, HttpServletRequest argümanına erişebilirsiniz.HttpServletRequest'in Spring AOP isteğine nasıl eklenmesi (özel senaryo)?

Ancak benim senaryoda çeviri hizmetim var, şu anda çeviri için kullanıcının yerel ayarını sürdüren oturum kapsamlıdır. Ben bu hizmet durumsal hale getirir hissediyorum ve ayrıca ben gerçekten Singleton olduğunu düşünüyorum gibi oturum kapsamı olmasını istemiyorum. Ancak çeviri hizmeti yöntemlerinin çağrıldığı birden çok yer vardır ve bu nedenle bu yöntemlerde istek/yerel ayar eklemek için imzayı değiştirmek istemiyorum. Sorun, çeviri hizmeti yöntemlerinin tüm arayanlarının HttpServletRequest (denetleyici yöntemleri değil) erişimine sahip olmamasıdır? Çeviri hizmeti yöntemlerinin bir yönünü yazabilirim ve bir şekilde arayanın içeriğinde olup olmadığına bakılmaksızın HttpServletRequest'e sihirli bir şekilde erişebilir miyim?

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

şimdi, ben tavsiye isteği alamayan, HttpServletRequest yok çevirmek arayanın? Bir çözüm var mı?

cevap

28

Ben arayanın bağlamında mevcut olup olmadığını bakılmaksızın ait HttpServletRequest bir çeviri hizmeti yöntemlerinin etrafında yönünü ve sihirli bir şekilde almak erişimi yazabilir miyim?

Kolayca değil. Aslında çok çaba gerektirecekti.

Bunu yapmanın kolay yolu, RequestContextHolder güvenmektir. Her istekte, DispatcherServlet geçerli HttpServletRequest öğesini RequestContextHolder'daki static ThreadLocal nesnesine bağlar. Sen advice() yönteminde Bunu yapabilirsin

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

ile aynı Thread içinde yürütürken alabilmesi ve bu nedenle bir parametre ilan etmeye gerek yoktur.