Comment injecter HttpServletRequest au Spring AOP demande (scénario)?
Je sais que le niveau moyen de l'écriture d'un AOP conseils autour d'une méthode de contrôleur et que vous pouvez obtenir l'accès à la HttpServletRequest arg, s'il est déclaré dans la méthode du contrôleur.
Mais mon scénario, c'est que j'ai un service de traduction, qui est actuellement à la session de l'étendue de maintien de la locale de l'utilisateur pour la traduction. Je pense que ça rend le service dynamique et aussi je ne veux pas qu'il soit à la session de l'étendue, comme je pense qu'il est vraiment Singleton. Mais il y a plusieurs endroits où le service de traduction méthodes sont appelées et donc je ne veux pas changer la signature de demande d'ajout/locale dans ces méthodes. Le problème est que tous les appelants de la traduction du service méthodes n'ont pas accès à HttpServletRequest (pas de contrôleur de méthodes)? Puis-je écrire un aspect autour de la traduction des méthodes de service et d'une certaine façon comme par magie accéder à HttpServletRequest, indépendamment de savoir si elle est disponible dans de l'appelant contexte ou pas?
@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) { .... }
}
Si maintenant, l'appelant de traduire n'a pas HttpServletRequest, je ne peux pas obtenir la demande dans les conseils? Est-il une solution?
OriginalL'auteur Paddy | 2013-10-09
Vous devez vous connecter pour publier un commentaire.
Pas facilement. En fait, il faudrait beaucoup d'efforts.
Le moyen facile de le faire est de compter sur
RequestContextHolder
. Dans chaque requête, leDispatcherServlet
lie l'actuelHttpServletRequest
à unstatic ThreadLocal
objet dans leRequestContextHolder
. Vous pouvez le récupérer lors de l'exécution dans la mêmeThread
avecVous pouvez le faire dans le
advice()
méthode et n'ont donc pas besoin de déclarer un paramètre.OriginalL'auteur Sotirios Delimanolis