web-dev-qa-db-fra.com

Comment obtenir le contexte de la demande actuelle dans Spring-Webflux

Dans le Spring-mvc classique, il est possible de définir des attributs de portée de requête sur un RequestContextHolder. En s'appuyant sur cela, nous pouvons analyser une demande entrante dans un HandlerInterceptorAdapter, définir des paramètres de demande tels que l'utilisateur actuellement connecté, l'ID de demande unique (pour la corrélation des journaux), etc. Ces attributs de demande peuvent être récupérés de manière statique à partir de tout service (pas seulement les contrôleurs) pendant la durée de vie de la demande.

J'essaie de réaliser quelque chose de similaire avec spring-webflux.

Je pourrais utiliser un WebFilter pour intercepter toutes les demandes entrantes, obtenir le ServerWebExchange actuel et définir des attributs dessus. Cependant, je ne vois aucun moyen d'obtenir le ServerWebExchange de la requête actuelle ailleurs que par les méthodes du contrôleur.

Je cherche une meilleure solution que de passer ServerWebExchange (ou ServerHttpRequest) tout autour.

Il semble que cela soit difficile à réaliser dans webflux car nous ne pouvons pas compter sur l'enregistrement des variables associées à une demande particulière sur ThreadLocal (en raison de l'architecture non bloquante, un seul thread peut basculer entre les demandes en cours de vol).
Pourtant, c'est une exigence importante. Peut-être existe-t-il une approche différente?

20
Doron Gold

Les approches que vous décrivez sont celles actuellement prises en charge. Comme vous l'avez souligné, l'utilisation d'une approche statique avec ThreadLocals n'est pas possible.

Reactor recherche des alternatives avec une nouvelle fonctionnalité de contexte (voir ce PR ). Spring est susceptible de prendre cela en compte et de l'utiliser, mais pas nécessairement pour les attributs de demande, car le modèle actuel convient assez bien.

Si vous souhaitez qu'un point d'extension particulier intercepte les demandes, veuillez créer un problème JIRA sur le projet Spring Framework, décrivant ce que vous essayez de réaliser et où les choses échouent.

6
Brian Clozel