2015-10-17 2 views
0

Attentes: Lorsque j'essaie de faire une réservation, la réservation a échoué en raison du changement de prix et du lancement en dessous de l'exception de changement de prix.Rediriger Message d'erreur dans le flux Web de printemps

Ensuite, je dois capturer ces erreurs dans l'événement et rediriger la demande à la page précédente et afficher le message d'erreur en haut de la page.

Selon mon ci-dessous la logique que je peux en mesure de rediriger la requête à la page précédente, tout en jetant exception changement de prix, mais la question est que je ne peux pas pouvoir afficher à mon message d'erreur (Votre prix de réservation a été changé, s'il vous plaît choisissez un autre) sur la page précédente.

Tout le monde peut m'aider. Merci d'avance.

BookAction.java

public class BookAction { 
    private static final String PRICE_CHANGED_ERROR = "Your booking price has been changed, please choose another"; 

    public Event book(RequestContext context) { 
    try { 
     // Booking attempt 
     // Consider booking attempt failed and throwing price change exception 

    }catch (PriceChangeException priceChangeException) { 
      return handlePriceChange(context); 
    } 
    } 

    public Event handlePriceChange(RequestContext context) { 

     Errors pageErrors = getPageErrors(context); 
     if (true) { // Consider if its true and returning new Event "searchPage" 
      pageErrors.reject(PRICE_CHANGED_ERROR); 
      return new Event(this, "searchPage"); 
     } 
     return error(); 
    } 

} 

booking.xml

<webflow:flow> 
    <webflow:action-state id="book"> 
     <webflow:evaluate expression="bookAction.book" />  
     <webflow:transition on="success" to="confirm" /> 
     <webflow:transition on="error" to="handleFrd" /> 
     <webflow:transition on="searchPage" to="searchPage" /> 
    </webflow:action-state> 

    <webflow:end-state id="searchPage" view="externalRedirect:#{flowScope.bookState.searchResultURI}" /> 

</webflow:flow> 
+0

essayer avec flashscope: s'il vous plaît se référer http://sunmingtao.blogspot.in/2012 /10/request-flash-view-scope-in-spring.html –

Répondre

0

dans booking.xml, AJOUTZ changements

<webflow:transition on="searchPage" to="searchPage"> 
    <set name="flowScope.error" value="'text u wanna show in next page'" type="string" /> 
</webflow:transition 

Et maintenant dans la page redirigée essayer lire ce texte. J'espère que ça marcherait!

+1

Je ne pense pas que vous serez en mesure de lire le contenu de "flowScope.error "après la redirection a eu lieu. Parce qu'une fois que vous effectuez un "externalRedirect" à une autre page ... le flux se termine et ainsi le flowScope est effacé en supprimant votre chaîne "error". – Selwyn

+0

Oui @Airduster. Je ne pouvais pas lire ce message d'erreur. Pouvez-vous s'il vous plaît donner une solution alternative? – Mohan

+0

@Mohan voir ma réponse soumise – Selwyn

0

Malheureusement, il s'agit d'une partie peu documentée de SWF. Ce que vous cherchez est d'utiliser le flashScope. flashScope a été spécialement conçu à cet effet après la lecture automatique d'une variable dans le flashScope.

Mais ... le problème de conception dans SWF est que le flashScope fonctionne uniquement entre un flux parent et un flux enfant intégré à l'intérieur de celui-ci. Il ne conservera pas vos variables si vous utilisez un "externalRedirect" et essayez d'accéder à l'erreur en utilisant "flashScope.error" ... car techniquement, le premier flux s'est terminé et un nouveau flux a commencé. Alors, comment résoudre ce problème?

J'ai été seulement capable de le résoudre de deux manières et les deux sont des hacks.

Option 1.

si le message est simple alors dans le 'externalRedirect:#{flowScope.bookState.searchResultURI}' ajouter un param HTTP GET tels que

?msg=An Error Occurred. 

Bien que cela sembler laid dans la barre d'URL, il est plus simple et la solution la moins douloureuse.

Option 2.

est un peu plus douloureux, mais la plus souple si vous voulez msgs d'erreur complexes. Fondamentalement, vous devez fusionner le flashScope de Spring Web Flow et le flashMap de Spring MVC et envoyer votre externalRedirect à un contrôleur de printemps mvc en premier.

Vous devrez créer et enregistrer un FlowExecutionListenerAdapter pour fusionner (pirater) le flashScope et le flashMap voir le lien directement ci-dessous pour les instructions étape par étape (ignorer les choses à propos SessionMap)

Spring web flow how to add flash attribute when exiting from flow to external redirect

ensuite, une fois que vous atteindre que vous pouvez facilement accéder à votre erreur variable flash msg en utilisant Spring MVC comme ceci:

How to read flash attributes after redirection in Spring MVC 3.1?

Note: la variable sera déjà dans la flashMap de Spring mvc. Donc, tout ce que vous avez à faire est de rendre une vue dans spring mvc et d'accéder à la variable depuis la vue.

Mes 2 cents: en raison de limitations comme celle-ci, j'ai personnellement cessé d'utiliser webflow et n'utilise que Spring MVC exclusivement maintenant. Je pense que le flux Spring Web est toujours utile pour des cas d'utilisation très simples (flux A -> flux B -> flux C) mais si vous essayez de faire quelque chose de plus complexe ou que vous essayez d'apprendre SWF à partir de rien ... mon conseil pour vous est d'utiliser Spring MVC ... il vous fera gagner beaucoup de temps à long terme. Je pense qu'ils travaillent sur une révision majeure pour SWF (3.0) peut-être alors toutes ces limitations seront résolues

+0

J'ai créé une demande d'amélioration sur leur projet jira. https://jira.spring.io/browse/SWF-1672 permet de voir ce qu'ils disent. – Selwyn

0

En effet Spring Web Flow a un certain nombre d'étendues où les variables peuvent être stockées mais quand un flux se termine toutes les portées se terminent comme Bien, à moins que le flux ne soit un flux enfant, le contrôle du flux parent est renvoyé au flux parent, auquel cas vous pouvez utiliser la portée flash en plus de toutes les variables étendues du flux parent. Spring Web Flow sait également comment interagir avec la portée du flash Spring MVC. Ainsi, lorsqu'un flux de niveau supérieur se termine et que la redirection est vers un point de terminaison Spring MVC, il existe un moyen d'indiquer que les variables de sortie doivent être placées dans la portée Flash Spring MVC, ce qui les rend disponibles après la redirection.

Ceci est mentionné dans la documentation de référence http://docs.spring.io/autorepo/docs/webflow/current/reference/html/spring-mvc.html#spring-mvc-flash-output.

0

utilisation étendue flash:

Dans xml

<set name="flashScope.flashScopeAttribute" value="'f'" /> 

Dans JSP

flash scope: #{flashScopeAttribute} 
+0

Cela ne fonctionnera pas sur un externalRedirect – Selwyn