[ SPRING WEB FLOW 2.1.0 ] – Comment récupérer la valeur d’une variable définie dans un flot depuis un contrôleur Java ?

La question peut paraître simple mais la réponse ne saute pas aux yeux...

Contexte

J'ai un flot qui doit valoriser une variable (maVariable) à un niveau tel qu'à la sortie du flot, la variable doit être conservée pour être réutilisée à la prochaine entrée dans le flot (ce qui correspond à la session HTTP); dans un premier temps, je pense au niveau conversationScope. Ce flot initialise une JSP, depuis laquelle je peux solliciter un contrôlleur MVC pour écrire sur l'objet response un document que l'utilisateur souhaite télécharger. Le document à exporter est justement contenu dans la variable du flot. Le problème est donc de récupérer depuis le contrôleur (en dehors du flot, donc) la valeur de la variable.

Idée première

Oubliez tout de suite l'accès au bean org.springframework.webflow.execution.RequestContext via le org.springframework.webflow.execution.RequestContextHolder, pourtant bien pratique ma fois...

final RequestContext requestContext = RequestContextHolder.getRequestContext();
final MutableAttributeMap conversationScope = requestContext.getConversationScope();
final boolean containsAttribute = conversationScope.asMap().containsKey(maVariable);

... car cela ne fonctionne qu'à l'intérieur du flot, et donc pas dans notre cas!

Solution

Non, en fait, il ne faut pas stocker ma varibale sur un des niveaux définis par Spring (conversationScope, flowScope...) mais sur l'objet externalContext, comme l'indique le guide de référence de Spring Web Flow dans sa partie Expression Language. L'avantage est qu'il y a un lien direct entre ce contexte et la session HTTP.
Le code de la solution est donc le suivant.
... dans le flot XML :

	<evaluate expression="[valeur de la variable]" result="externalContext.sessionMap.maVariable" />

... et dans le contrôleur MVC :

@Controller
public class DownloableObjectsController
    extends AbstractController
{
	protected ModelAndView handleRequestInternal(final HttpServletRequest request,
                                                 final HttpServletResponse response)
        throws Exception
    {
        // Récupération de la variable de la session
        final DownloadableBeanObject downloadableObject =
            (DownloadableBeanObject) request.getSession().getAttribute("maVariable");
			
		[...]
	}
}

Bon code!

Un commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.